powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / sql как выполняется связывание LEFT и OUTER JOIN
15 сообщений из 15, страница 1 из 1
sql как выполняется связывание LEFT и OUTER JOIN
    #38717891
Ребята, у меня вопрос.
Допустим есть инструкция SQL:
Код: sql
1.
SELECT * FROM tblClients LEFT JOIN tblAccount ON tblClients.IDClient=tblAccount.IDClient


Все прозрачно и понятно, классический пример левостороннего внешнего объединения, при котором извлекаются все строки из таблицы tblClients, а из таблицы tblAccount извлекаются записи для которых есть внешний ключ IDClient, если внешний ключ такой отсутствует, то значение дополняется null.
Возьмем в продолжении примера 2 субд MS Access и Oracle и добавим ещё одну табличку tblAccountSum, пускай на ней хранятся остатки на счетах за даты.
Нам надо получить эти остатки.
Делаем инструкцию SQL для MS Access:
Код: sql
1.
SELECT * FROM (tblClients LEFT JOIN tblAccount ON tblClients.IDClient=tblAccount.IDClient) LEFT JOIN tblAccountSum ON tblAccount.IDAccount=tblAccountSum.IDAccount


Тут очень удобно, мы объединяем все записи из объединения в скобках (то что слева) и связываем их с записями из tblAccountSum, чего там нет, дополняем null.
Если брать oracle, то можно использовать и инструкцию
Код: sql
1.
SELECT * FROM (tblClients LEFT JOIN tblAccount ON tblClients.IDClient=tblAccount.IDClient) LEFT JOIN tblAccountSum ON tblAccount.IDAccount=tblAccountSum.IDAccount


а можно и такого вида
Код: sql
1.
SELECT * FROM tblClients LEFT JOIN tblAccount ON tblClients.IDClient=tblAccount.IDClient LEFT JOIN tblAccountSum ON tblAccount.IDAccount=tblAccountSum.IDAccount


Вот в данном случае что подразумевается за ЛЕВОЙ таблицей? Мы указываем ЛЕВУЮ таблицу в [b]tblAccount.IDAccount =tblAccountSum.IDAccount?[/b] Но получается, что это не вся таблица tblAccount, а результат связки tblClients.IDClient=tblAccount.IDClient.
Или я что-то неправильно понимаю?
...
Рейтинг: 0 / 0
sql как выполняется связывание LEFT и OUTER JOIN
    #38717914
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обе конструкции идентичны. Неважно в каком порядке будет объединение. На результат это не повлияет.
...
Рейтинг: 0 / 0
sql как выполняется связывание LEFT и OUTER JOIN
    #38717955
Dima TОбе конструкции идентичны. Неважно в каком порядке будет объединение. На результат это не повлияет.
Это понятно, просто мы набираем таблицы для связок последовательно, например так:
Код: sql
1.
2.
3.
T1 LEFT JOIJN T2 ON T1.pk=T2.fk 
LEFT JOIN T3 ON t1.pk=t3.fk
LEFT JOIN T4 on t2.pk=t4.fk



Во внешнем объединении левая талица - это таблица, которая стоит с лева от конструкции LEFT JOIN, получается, что мы в данном случае объединяем все записи из связок с лева
...
Рейтинг: 0 / 0
sql как выполняется связывание LEFT и OUTER JOIN
    #38718029
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПростоинтересующийсяDima TОбе конструкции идентичны. Неважно в каком порядке будет объединение. На результат это не повлияет.
Это понятно, просто мы набираем таблицы для связок последовательно, например так:
Код: sql
1.
2.
3.
T1 LEFT JOIJN T2 ON T1.pk=T2.fk 
LEFT JOIN T3 ON t1.pk=t3.fk
LEFT JOIN T4 on t2.pk=t4.fk



Во внешнем объединении левая талица - это таблица, которая стоит с лева от конструкции LEFT JOIN, получается, что мы в данном случае объединяем все записи из связок с леваДля ТЕХ таблиц, которые УЧАСТВУЮТ в соответствующей связи, которую определяет ON.
...
Рейтинг: 0 / 0
sql как выполняется связывание LEFT и OUTER JOIN
    #38718065
Фотография George-III
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvПростоинтересующийсяпропущено...

Это понятно, просто мы набираем таблицы для связок последовательно, например так:
Код: sql
1.
2.
3.
T1 LEFT JOIJN T2 ON T1.pk=T2.fk 
LEFT JOIN T3 ON t1.pk=t3.fk
LEFT JOIN T4 on t2.pk=t4.fk




Во внешнем объединении левая талица - это таблица, которая стоит с лева от конструкции LEFT JOIN, получается, что мы в данном случае объединяем все записи из связок с леваДля ТЕХ таблиц, которые УЧАСТВУЮТ в соответствующей связи, которую определяет ON.
то есть, для связки LEFT JOIN T4 on t2.pk=t4.fk мы объединяем таблицу t2? Указывается это именно до LEFT JOIN, а не в предложении ON? То есть, если переписать вот так LEFT JOIN T4 on t4.fk=t2.pk, все равно будем объединять все записи из таблицы t2, с учетом её связок t1?
...
Рейтинг: 0 / 0
sql как выполняется связывание LEFT и OUTER JOIN
    #38718112
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
George-IIIsphinx_mvпропущено...
Для ТЕХ таблиц, которые УЧАСТВУЮТ в соответствующей связи, которую определяет ON.
то есть, для связки LEFT JOIN T4 on t2.pk=t4.fk мы объединяем таблицу t2? Указывается это именно до LEFT JOIN, а не в предложении ON? То есть, если переписать вот так LEFT JOIN T4 on t4.fk=t2.pk, все равно будем объединять все записи из таблицы t2, с учетом её связок t1?
Запрос НЕ задает фактический порядок объединения, как оно произойдет в реале решает движок СУБД. Во взрослых СУБД это видно в плане выполнения запроса.

Почитайте Дейта "Введение в системы баз данных", там этот вопрос описан. Синтаксис SQL построен так, что текст запроса содержит ЧТО надо выбрать, а КАК выбирать решает СУБД.

Правда иногда можно принудительно задать как объединять, например в MS SQL есть специальные хинты для этого (это уже за рамками стандарта SQL), но без острой необходимости рекомендуют ими не пользоваться.
...
Рейтинг: 0 / 0
sql как выполняется связывание LEFT и OUTER JOIN
    #38718156
Dima T,

да я знаю это, вопрос был именно в синтаксисе, а не в порядке объединения.
...
Рейтинг: 0 / 0
sql как выполняется связывание LEFT и OUTER JOIN
    #38718165
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПростоинтересующийсяDima T,

да я знаю это, вопрос был именно в синтаксисе, а не в порядке объединения.У Вас проблема не с синтаксисом (сервер же на запрос не ругается), а с пониманием логики объединения таблиц.
...
Рейтинг: 0 / 0
sql как выполняется связывание LEFT и OUTER JOIN
    #38718185
sphinx_mvПростоинтересующийсяDima T,

да я знаю это, вопрос был именно в синтаксисе, а не в порядке объединения.У Вас проблема не с синтаксисом (сервер же на запрос не ругается), а с пониманием логики объединения таблиц.
ну я бы сказал с пониманием синтаксиса )
В общем вопрос снят, разобрался сам.
...
Рейтинг: 0 / 0
sql как выполняется связывание LEFT и OUTER JOIN
    #38718236
Вот например такая инструкция:
Код: sql
1.
2.
select * from (select 1 d from dual union all select 2 from dual) right join (select 1 j from dual union all select 3 j from dual union all select 4 j from dual) on j=d 
right join (select 1 k from dual union all select 3 from dual) on k=j



Код: plaintext
1.
2.
 D       J       K 
 1	1	1
null	3	3 

а если её обрезать, то такой результат
Код: sql
1.
select * from (select 1 d from dual union all select 2 from dual) right join (select 1 j from dual union all select 3 j from dual union all select 4 j from dual) on j=d



Код: plaintext
1.
2.
3.
 D      J 
1	1
null	3
null	4

получается, что (select 1 k from dual union all select 3 from dual) дает 2 записи, связка k=j дает результирующий набор
Код: plaintext
1.
2.
         J       K 
 	1	1
	3	3 
а связка с (select 1 d from dual union all select 2 from dual) по on j=d, дает итог
Код: plaintext
1.
2.
 D       J       K 
 1	1	1
null	3	3 
Движок субд тут уже сам связывает.
...
Рейтинг: 0 / 0
sql как выполняется связывание LEFT и OUTER JOIN
    #38725589
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простоинтересующийся,

что-то много текста для простого вопроса озвученного изначально... вопрос связывания таблиц очень прост:
то что слева от join считается левой частью, а то что справа от него - правой... :) Вот и вся премудрость. А то в последнем сообщении уже какие-то путающие union'ы пошли...

Код: plsql
1.
SELECT `что-то там` FROM t1 RIGHT JOIN t2 ON 'blabla'='blabla' LEFT JOIN t3 ON 'blablabla'='blablabla'


если blabla заменить на нормальные условия, то выбираться будет по принципу:
1. взять t1 и t2... дописать к правой таблице (t2) столбцы левой (t1)
2. взять левую таблицу (результат t1+t2) и правую (t3)... дописать к левой таблице (t1+t2) столбцы правой (t3)

и такая логика будет срабатывать если таблиц будет 20 или 30... или 150 :)
...
Рейтинг: 0 / 0
sql как выполняется связывание LEFT и OUTER JOIN
    #38725614
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЗапрос НЕ задает фактический порядок объединения, как оно произойдет в реале решает движок СУБД.
Это не так. В противном случае результат был бы недетерминирован. Вот порядок считывания/сканирования таблиц и правда не задаётся текстом запроса (впрочем, в некоторых СУБД - всё-таки порядок считывания определяется текстом запроса в случае сторонних соединений или если порядок считывания задан явно).
...
Рейтинг: 0 / 0
sql как выполняется связывание LEFT и OUTER JOIN
    #38725641
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простоинтересующийся, левое или правое - влияет на поведиение JOIN когда внешние ключи IS NULL.
Если таковых нет - то всё одно.

Скобки меняют ЛОГИКУ работы реляционных операций и могут давать разный (не ассоциативнсть) эффект.
...
Рейтинг: 0 / 0
sql как выполняется связывание LEFT и OUTER JOIN
    #38725687
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaDima TЗапрос НЕ задает фактический порядок объединения, как оно произойдет в реале решает движок СУБД.
Это не так. В противном случае результат был бы недетерминирован. Вот порядок считывания/сканирования таблиц и правда не задаётся текстом запроса (впрочем, в некоторых СУБД - всё-таки порядок считывания определяется текстом запроса в случае сторонних соединений или если порядок считывания задан явно).
Может коряво выразился, я тоже самое хотел сказать: "порядок считывания/сканирования таблиц и правда не задаётся текстом запроса"

maytonПростоинтересующийся, левое или правое - влияет на поведиение JOIN когда внешние ключи IS NULL.
Если таковых нет - то всё одно.
Неверно.

maytonСкобки меняют ЛОГИКУ работы реляционных операций и могут давать разный (не ассоциативнсть) эффект.
Скобки никогда не использую в джоинах, но что-то подсказывает что не меняют они логику. Если разубедишь примером, скажу спасибо :)
...
Рейтинг: 0 / 0
sql как выполняется связывание LEFT и OUTER JOIN
    #38725718
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСкобки никогда не использую в джоинах, но что-то подсказывает что не меняют они логику. Если разубедишь примером, скажу спасибо :)
Логика прячется не в порядке (в т.ч. задаваемом скобками), а в выражениях связывания.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / sql как выполняется связывание LEFT и OUTER JOIN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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