Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / условия сравнения при JOIN / 19 сообщений из 19, страница 1 из 1
01.02.2019, 12:41
    #39768083
dermama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
Товарищи! ПРиветствую!

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
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 все понятно...

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

Код: sql
1.
2.
3.
4.
5.
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

Спасибо.
...
Рейтинг: 0 / 0
01.02.2019, 12:48
    #39768092
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
dermama,

а что не так? условие сравнения выполнено. Для каждой строки из таблицы слева выбрать строки из таблицы справа, для которых значение справа будет меньше, чем слева.
...
Рейтинг: 0 / 0
01.02.2019, 12:54
    #39768105
dermama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
Владислав Колосовdermama,

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

Спасибо, я разобрался)
...
Рейтинг: 0 / 0
01.02.2019, 12:59
    #39768111
dermama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
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 в сравнении..
...
Рейтинг: 0 / 0
01.02.2019, 13:48
    #39768159
waszkiewicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
dermama,
тебе же написали уже. Или читать уже не модно?
...
Рейтинг: 0 / 0
01.02.2019, 14:00
    #39768179
dermama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
waszkiewiczdermama,
тебе же написали уже. Или читать уже не модно?

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

а ты читать умеешь? я разобрался с прницпом. - у меня вопрос совсем в другом.
...
Рейтинг: 0 / 0
01.02.2019, 14:16
    #39768199
waszkiewicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
dermama,

условие в on истинно? Что ж ты еще хочешь?
...
Рейтинг: 0 / 0
01.02.2019, 14:20
    #39768204
dermama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
waszkiewiczdermama,

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

теперь понятно, спасибо!
...
Рейтинг: 0 / 0
01.02.2019, 14:40
    #39768225
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
dermamaя разобрался с прницпомЛогически выполнение запроса выглядит так: для каждой строки j1 перебираем все строки в j2, и выводим те сочетания строк из j1 и 2, для которых выполнено условие после "on". Это как бы два воображаемых "вложенных цикла".

То же самое будет, когда в запросе участвуют больше таблиц, только тогда этих воображаемых "вложенных циклов" будет не 2, а больше, по количеству таблиц.
...
Рейтинг: 0 / 0
01.02.2019, 14:45
    #39768229
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
alexeyvgdermamaя разобрался с прницпомЛогически выполнение запроса выглядит так: для каждой строки j1 перебираем все строки в j2, и выводим те сочетания строк из j1 и 2, для которых выполнено условие после "on". Это как бы два воображаемых "вложенных цикла".

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


Этот запрос до Нового Года выведет 0 строк, а после Нового Года выведет все комбинации строк из joins и joins2
...
Рейтинг: 0 / 0
01.02.2019, 15:27
    #39768266
dermama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
alexeyvg,

Спасибо за полезную информацию.
...
Рейтинг: 0 / 0
01.02.2019, 23:24
    #39768561
pahanitto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
alexeyvgdermamaя разобрался с прницпомЛогически выполнение запроса выглядит так: для каждой строки j1 перебираем все строки в j2, и выводим те сочетания строк из j1 и 2, для которых выполнено условие после "on". Это как бы два воображаемых "вложенных цикла".

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

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

смотрите план запроса
...
Рейтинг: 0 / 0
01.02.2019, 23:28
    #39768564
pahanitto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
и да вложенных циклов может быт НАМНОГО больше чем колво таблиц. могу привести пример если интересно. сеек и скан индекса дает 2 ллуп.. при джойне 2х таблиц. и того 2 таблице а цикла 2
...
Рейтинг: 0 / 0
01.02.2019, 23:43
    #39768565
pahanitto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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 луп. проблемс(
...
Рейтинг: 0 / 0
02.02.2019, 08:05
    #39768610
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
pahanittoalexeyvgЛогически выполнение запроса выглядит так: для каждой строки j1 перебираем все строки в j2, и выводим те сочетания строк из j1 и 2, для которых выполнено условие после "on". Это как бы два воображаемых "вложенных цикла".

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

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

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

А на самом деле, логически это очень просто: "проверка условий для каждого сочетания строк".
...
Рейтинг: 0 / 0
02.02.2019, 21:39
    #39768765
pahanitto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
ну реляционная алгебра ето гут ..я например ее не знаю я двигателист( но вообще тчо тут не понятного? на пальцах можно пояснить
...
Рейтинг: 0 / 0
02.02.2019, 21:41
    #39768767
pahanitto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
пусть почитают умные книги от Ицке Бен Гана... полезно будет там все описано
...
Рейтинг: 0 / 0
04.02.2019, 09:29
    #39769064
dermama
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
pahanittoпусть почитают умные книги от Ицке Бен Гана... полезно будет там все описано

а название книжки можно полностью?
...
Рейтинг: 0 / 0
04.02.2019, 10:18
    #39769090
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
условия сравнения при JOIN
dermamapahanittoпусть почитают умные книги от Ицке Бен Гана... полезно будет там все описано

а название книжки можно полностью?
"Microsoft SQL Server 2012. Основы T-SQL"
Есть ещё 2: https://www.labirint.ru/authors/127540/
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / условия сравнения при JOIN / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]