Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 условия сравнения при JOIN  [new]
dermama
Member

Откуда:
Сообщений: 141
Товарищи! ПРиветствую!

Объясните пожалуйста логику результирующего множества при джойне 2х таблиц в условии джойна которых использую операторы сравнения > или <.

CREATE TABLE joins
(
ID int NOT NULL,
name varchar (20),
otdel int,
CONSTRAINT PK_IiD PRIMARY KEY (ID)
)
INSERT INTO joins
VALUES
(1, 'Ivan', 10),
(2, NULL, 10),
(3, 'Bidlan', 20),
(4, 'Kaplan', 30),
(5, NULL, 30)


CREATE TABLE joins2
(
otdel int NOT NULL,
oname varchar (20),
loc varchar(20),
CONSTRAINT PK_otdel PRIMARY KEY (otdel)
)

INSERT INTO joins2
VALUES
(10, 'PROGRESS', 'Moskau'),
(20, 'REGRESS', 'Tver'),
(30, 'DEDUKT', 'Omsk'),
(40, 'INDUKT', 'Rostov'),
(50, 'KONDUKT', 'SPB')


ALTER TABLE joins
ADD CONSTRAINT FK_otdel FOREIGN KEY (otdel)
REFERENCES joins2 (otdel)



С запросами в которых условие ON j1.otdel = j2.otdel все понятно...

Однако в запросе плана

SELECT j1.otdel, j2.otdel
FROM joins j1
INNER JOIN
joins2 j2
ON j1.otdel > j2.otdel


где сравниваю отделы.. Результирующее множество вводит меня в ступор... Прошу вас объяснитью

Само множество

otdel otdel
20 10
30 10
30 10
30 20
30 20

Спасибо.
1 фев 19, 12:41    [21799551]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6188
dermama,

а что не так? условие сравнения выполнено. Для каждой строки из таблицы слева выбрать строки из таблицы справа, для которых значение справа будет меньше, чем слева.
1 фев 19, 12:48    [21799564]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
dermama
Member

Откуда:
Сообщений: 141
Владислав Колосов
dermama,

а что не так? условие сравнения выполнено. Для каждой строки из таблицы слева выбрать строки из таблицы справа, для которых значение справа будет меньше, чем слева.


Спасибо, я разобрался)
1 фев 19, 12:54    [21799578]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
dermama
Member

Откуда:
Сообщений: 141
dermama,

У меня еще один вопрос

Почему при условии

SELECT j1.otdel, j2.otdel
FROM joins j1
INNER JOIN
joins2 j2
ON j1.otdel < j2.otdel

результирующее множество

otdel otdel
10 20
10 20
10 30
10 30
20 30
10 40
10 40
20 40
30 40
30 40
10 50
10 50
20 50
30 50
30 50

как при правом соединении? ведь по идее, при внутреннем соединении должны использвоать лишь данные которые есть в обеих таблицах, а тут уже используются отделы 40 и 50 в сравнении..
1 фев 19, 12:59    [21799585]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
waszkiewicz
Member

Откуда:
Сообщений: 968
dermama,
тебе же написали уже. Или читать уже не модно?
1 фев 19, 13:48    [21799650]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
dermama
Member

Откуда:
Сообщений: 141
waszkiewicz
dermama,
тебе же написали уже. Или читать уже не модно?


как при правом соединении? ведь по идее, при внутреннем соединении должны использвоать лишь данные которые есть в обеих таблицах, а тут уже используются отделы 40 и 50 в сравнении..

а ты читать умеешь? я разобрался с прницпом. - у меня вопрос совсем в другом.
1 фев 19, 14:00    [21799679]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
waszkiewicz
Member

Откуда:
Сообщений: 968
dermama,

условие в on истинно? Что ж ты еще хочешь?
1 фев 19, 14:16    [21799702]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
dermama
Member

Откуда:
Сообщений: 141
waszkiewicz
dermama,

условие в on истинно? Что ж ты еще хочешь?


теперь понятно, спасибо!
1 фев 19, 14:20    [21799708]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27704
dermama
я разобрался с прницпом
Логически выполнение запроса выглядит так: для каждой строки j1 перебираем все строки в j2, и выводим те сочетания строк из j1 и 2, для которых выполнено условие после "on". Это как бы два воображаемых "вложенных цикла".

То же самое будет, когда в запросе участвуют больше таблиц, только тогда этих воображаемых "вложенных циклов" будет не 2, а больше, по количеству таблиц.
1 фев 19, 14:40    [21799750]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27704
alexeyvg
dermama
я разобрался с прницпом
Логически выполнение запроса выглядит так: для каждой строки j1 перебираем все строки в j2, и выводим те сочетания строк из j1 и 2, для которых выполнено условие после "on". Это как бы два воображаемых "вложенных цикла".

То же самое будет, когда в запросе участвуют больше таблиц, только тогда этих воображаемых "вложенных циклов" будет не 2, а больше, по количеству таблиц.
А условие после "on" может быть абсолютно любым.
Например:
SELECT j1.otdel, j2.otdel
FROM joins j1
  INNER JOIN joins2 j2
    ON getdate() > '20200101'

Этот запрос до Нового Года выведет 0 строк, а после Нового Года выведет все комбинации строк из joins и joins2
1 фев 19, 14:45    [21799758]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
dermama
Member

Откуда:
Сообщений: 141
alexeyvg,

Спасибо за полезную информацию.
1 фев 19, 15:27    [21799814]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
pahanitto
Member

Откуда:
Сообщений: 28
alexeyvg
dermama
я разобрался с прницпом
Логически выполнение запроса выглядит так: для каждой строки j1 перебираем все строки в j2, и выводим те сочетания строк из j1 и 2, для которых выполнено условие после "on". Это как бы два воображаемых "вложенных цикла".

То же самое будет, когда в запросе участвуют больше таблиц, только тогда этих воображаемых "вложенных циклов" будет не 2, а больше, по количеству таблиц.


не совсем так
репроцессор ервака может ко кешу опередлить наименьшуюю по мощьности(колко строк) и к ней применить условие а к ней уже применить нестет лупс(вложенные циклы)... но а) надо смотреть объем таблиц б) лучшеб он применил мердж

смотрите план запроса
1 фев 19, 23:24    [21800221]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
pahanitto
Member

Откуда:
Сообщений: 28
и да вложенных циклов может быт НАМНОГО больше чем колво таблиц. могу привести пример если интересно. сеек и скан индекса дает 2 ллуп.. при джойне 2х таблиц. и того 2 таблице а цикла 2
1 фев 19, 23:28    [21800224]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
pahanitto
Member

Откуда:
Сообщений: 28
use tempdb;
go

create table T1 (
 id int identity(1,1),
 color int primary key clustered,
 dddd nvarchar(10)

);

create table T2 (
 id int identity(1,1)  ,
 color int  primary key clustered,
 dddd nvarchar(10)

);

select * from
T1 
inner join T2 

on t1.color = T2.color



вот так 1 луп. если в 1 таблице колор является кластерныем а в другой просто индексом то добавляется 2 луп. проблемс(
1 фев 19, 23:43    [21800226]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27704
pahanitto
alexeyvg
Логически выполнение запроса выглядит так: для каждой строки j1 перебираем все строки в j2, и выводим те сочетания строк из j1 и 2, для которых выполнено условие после "on". Это как бы два воображаемых "вложенных цикла".

То же самое будет, когда в запросе участвуют больше таблиц, только тогда этих воображаемых "вложенных циклов" будет не 2, а больше, по количеству таблиц.
не совсем так
репроцессор ервака может ко кешу опередлить наименьшуюю по мощьности(колко строк) и к ней применить условие а к ней уже применить нестет лупс(вложенные циклы)... но а) надо смотреть объем таблиц б) лучшеб он применил мердж

смотрите план запроса
Не-не, я же говорю - "логически".
Я описываю, не "как исполняется запрос", а "какой будет результат".

Потому что большинство начинающих специалистов не понимает, что там накорябано в условиях, что это за "JOIN" такой, вы же видите, как автор недоумевает, что означает условие: "j1.otdel > j2.otdel". Они учат в ВУЗе реляционную алгебру, умные все, но не понимают.

А на самом деле, логически это очень просто: "проверка условий для каждого сочетания строк".
2 фев 19, 08:05    [21800304]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
pahanitto
Member

Откуда:
Сообщений: 28
ну реляционная алгебра ето гут ..я например ее не знаю я двигателист( но вообще тчо тут не понятного? на пальцах можно пояснить
2 фев 19, 21:39    [21800560]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
pahanitto
Member

Откуда:
Сообщений: 28
пусть почитают умные книги от Ицке Бен Гана... полезно будет там все описано
2 фев 19, 21:41    [21800563]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
dermama
Member

Откуда:
Сообщений: 141
pahanitto
пусть почитают умные книги от Ицке Бен Гана... полезно будет там все описано


а название книжки можно полностью?
4 фев 19, 09:29    [21801038]     Ответить | Цитировать Сообщить модератору
 Re: условия сравнения при JOIN  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27704
dermama
pahanitto
пусть почитают умные книги от Ицке Бен Гана... полезно будет там все описано


а название книжки можно полностью?

"Microsoft SQL Server 2012. Основы T-SQL"
Есть ещё 2: https://www.labirint.ru/authors/127540/
4 фев 19, 10:18    [21801068]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить