|
|
|
sql как выполняется связывание LEFT и OUTER JOIN
|
|||
|---|---|---|---|
|
#18+
Ребята, у меня вопрос. Допустим есть инструкция SQL: Код: sql 1. Все прозрачно и понятно, классический пример левостороннего внешнего объединения, при котором извлекаются все строки из таблицы tblClients, а из таблицы tblAccount извлекаются записи для которых есть внешний ключ IDClient, если внешний ключ такой отсутствует, то значение дополняется null. Возьмем в продолжении примера 2 субд MS Access и Oracle и добавим ещё одну табличку tblAccountSum, пускай на ней хранятся остатки на счетах за даты. Нам надо получить эти остатки. Делаем инструкцию SQL для MS Access: Код: sql 1. Тут очень удобно, мы объединяем все записи из объединения в скобках (то что слева) и связываем их с записями из tblAccountSum, чего там нет, дополняем null. Если брать oracle, то можно использовать и инструкцию Код: sql 1. а можно и такого вида Код: sql 1. Вот в данном случае что подразумевается за ЛЕВОЙ таблицей? Мы указываем ЛЕВУЮ таблицу в [b]tblAccount.IDAccount =tblAccountSum.IDAccount?[/b] Но получается, что это не вся таблица tblAccount, а результат связки tblClients.IDClient=tblAccount.IDClient. Или я что-то неправильно понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 11:07 |
|
||
|
sql как выполняется связывание LEFT и OUTER JOIN
|
|||
|---|---|---|---|
|
#18+
Обе конструкции идентичны. Неважно в каком порядке будет объединение. На результат это не повлияет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 11:28 |
|
||
|
sql как выполняется связывание LEFT и OUTER JOIN
|
|||
|---|---|---|---|
|
#18+
Dima TОбе конструкции идентичны. Неважно в каком порядке будет объединение. На результат это не повлияет. Это понятно, просто мы набираем таблицы для связок последовательно, например так: Код: sql 1. 2. 3. Во внешнем объединении левая талица - это таблица, которая стоит с лева от конструкции LEFT JOIN, получается, что мы в данном случае объединяем все записи из связок с лева ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 11:58 |
|
||
|
sql как выполняется связывание LEFT и OUTER JOIN
|
|||
|---|---|---|---|
|
#18+
ПростоинтересующийсяDima TОбе конструкции идентичны. Неважно в каком порядке будет объединение. На результат это не повлияет. Это понятно, просто мы набираем таблицы для связок последовательно, например так: Код: sql 1. 2. 3. Во внешнем объединении левая талица - это таблица, которая стоит с лева от конструкции LEFT JOIN, получается, что мы в данном случае объединяем все записи из связок с леваДля ТЕХ таблиц, которые УЧАСТВУЮТ в соответствующей связи, которую определяет ON. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 12:49 |
|
||
|
sql как выполняется связывание LEFT и OUTER JOIN
|
|||
|---|---|---|---|
|
#18+
sphinx_mvПростоинтересующийсяпропущено... Это понятно, просто мы набираем таблицы для связок последовательно, например так: Код: sql 1. 2. 3. Во внешнем объединении левая талица - это таблица, которая стоит с лева от конструкции 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? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 13:04 |
|
||
|
sql как выполняется связывание LEFT и OUTER JOIN
|
|||
|---|---|---|---|
|
#18+
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), но без острой необходимости рекомендуют ими не пользоваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 13:28 |
|
||
|
sql как выполняется связывание LEFT и OUTER JOIN
|
|||
|---|---|---|---|
|
#18+
Dima T, да я знаю это, вопрос был именно в синтаксисе, а не в порядке объединения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 13:51 |
|
||
|
sql как выполняется связывание LEFT и OUTER JOIN
|
|||
|---|---|---|---|
|
#18+
ПростоинтересующийсяDima T, да я знаю это, вопрос был именно в синтаксисе, а не в порядке объединения.У Вас проблема не с синтаксисом (сервер же на запрос не ругается), а с пониманием логики объединения таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 13:55 |
|
||
|
sql как выполняется связывание LEFT и OUTER JOIN
|
|||
|---|---|---|---|
|
#18+
sphinx_mvПростоинтересующийсяDima T, да я знаю это, вопрос был именно в синтаксисе, а не в порядке объединения.У Вас проблема не с синтаксисом (сервер же на запрос не ругается), а с пониманием логики объединения таблиц. ну я бы сказал с пониманием синтаксиса ) В общем вопрос снят, разобрался сам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 14:03 |
|
||
|
sql как выполняется связывание LEFT и OUTER JOIN
|
|||
|---|---|---|---|
|
#18+
Вот например такая инструкция: Код: sql 1. 2. Код: plaintext 1. 2. а если её обрезать, то такой результат Код: sql 1. Код: plaintext 1. 2. 3. получается, что (select 1 k from dual union all select 3 from dual) дает 2 записи, связка k=j дает результирующий набор Код: plaintext 1. 2. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2014, 14:28 |
|
||
|
sql как выполняется связывание LEFT и OUTER JOIN
|
|||
|---|---|---|---|
|
#18+
Простоинтересующийся, что-то много текста для простого вопроса озвученного изначально... вопрос связывания таблиц очень прост: то что слева от join считается левой частью, а то что справа от него - правой... :) Вот и вся премудрость. А то в последнем сообщении уже какие-то путающие union'ы пошли... Код: plsql 1. если blabla заменить на нормальные условия, то выбираться будет по принципу: 1. взять t1 и t2... дописать к правой таблице (t2) столбцы левой (t1) 2. взять левую таблицу (результат t1+t2) и правую (t3)... дописать к левой таблице (t1+t2) столбцы правой (t3) и такая логика будет срабатывать если таблиц будет 20 или 30... или 150 :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 14:08 |
|
||
|
sql как выполняется связывание LEFT и OUTER JOIN
|
|||
|---|---|---|---|
|
#18+
Dima TЗапрос НЕ задает фактический порядок объединения, как оно произойдет в реале решает движок СУБД. Это не так. В противном случае результат был бы недетерминирован. Вот порядок считывания/сканирования таблиц и правда не задаётся текстом запроса (впрочем, в некоторых СУБД - всё-таки порядок считывания определяется текстом запроса в случае сторонних соединений или если порядок считывания задан явно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 14:23 |
|
||
|
sql как выполняется связывание LEFT и OUTER JOIN
|
|||
|---|---|---|---|
|
#18+
Простоинтересующийся, левое или правое - влияет на поведиение JOIN когда внешние ключи IS NULL. Если таковых нет - то всё одно. Скобки меняют ЛОГИКУ работы реляционных операций и могут давать разный (не ассоциативнсть) эффект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 14:34 |
|
||
|
sql как выполняется связывание LEFT и OUTER JOIN
|
|||
|---|---|---|---|
|
#18+
AkinaDima TЗапрос НЕ задает фактический порядок объединения, как оно произойдет в реале решает движок СУБД. Это не так. В противном случае результат был бы недетерминирован. Вот порядок считывания/сканирования таблиц и правда не задаётся текстом запроса (впрочем, в некоторых СУБД - всё-таки порядок считывания определяется текстом запроса в случае сторонних соединений или если порядок считывания задан явно). Может коряво выразился, я тоже самое хотел сказать: "порядок считывания/сканирования таблиц и правда не задаётся текстом запроса" maytonПростоинтересующийся, левое или правое - влияет на поведиение JOIN когда внешние ключи IS NULL. Если таковых нет - то всё одно. Неверно. maytonСкобки меняют ЛОГИКУ работы реляционных операций и могут давать разный (не ассоциативнсть) эффект. Скобки никогда не использую в джоинах, но что-то подсказывает что не меняют они логику. Если разубедишь примером, скажу спасибо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 15:10 |
|
||
|
sql как выполняется связывание LEFT и OUTER JOIN
|
|||
|---|---|---|---|
|
#18+
Dima TСкобки никогда не использую в джоинах, но что-то подсказывает что не меняют они логику. Если разубедишь примером, скажу спасибо :) Логика прячется не в порядке (в т.ч. задаваемом скобками), а в выражениях связывания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 15:33 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38718065&tid=1341254]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 396ms |

| 0 / 0 |
