Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Right JOIN


Автор: pavelv 11.9.2008, 05:07
Всем привет.
Сервер FireBird 2.1.0.17798.

Всегда думал, что right join работает следующим образом: Если даже нет данных в основной выборке, а в таблице Right Join есть то они и вернуться.

Тут на днях всё делаю и бац, не работает. Начал разбираться и понял, что то чего я собственно думал не верно.
Итак запрос:

Код

Select A.uni, B.uni
from A
right join B ON B.uni=A.uni
where A.uni=17

В таблице A нет данных у которых Uni = 17, но в таблице B есть данные у которых uni = 17. Итого результатом запроса должно быть:
NULL, 17
 или я что-то путаю?

Конечно можно всегда поменять таблицы местами и использовать Left join A, но хочется разобраться. 

P.S> Ногами не бейте smile.

Добавлено через 55 секунд
Эм поправка, результатом будет 
NULL, 17 
если в таблице B есть одна запись у которой UNI=17.

Автор: ТоляМБА 11.9.2008, 05:17
Код
Select A.uni, B.uni
from A
right join B ON B.uni=A.uni
AND A.uni=17


А так?

Автор: pavelv 11.9.2008, 06:10
Все данные из таблицы B, а вместе A.uni поставил NULL. Тоесть получается в 
RIGHT JOIN B ON (Указываются условия по которым нужно связываться с ведомой таблицей, а не те условия которые накладываются на таблицу B)
А если хочешь условия на таблицу B указывай их в разделе WHERE. Так получается?

Все равно не допонимаю почему в нашем случае A.uni=17 в условии WHERE приводит к пустой выборке?

Автор: Deniz 11.9.2008, 08:17
pavelv, A.uni = 17 - пустая выборка потому что
Цитата(pavelv @  11.9.2008,  08:07 Найти цитируемый пост)
В таблице A нет данных у которых Uni = 17

При объединении A и B по right, выбираются все записи из B и в строчку подставляются данные из А только когда выполняется условие объединения, прописанное в ON (...).
Сл-но получается запись типа 
Цитата(pavelv @  11.9.2008,  08:07 Найти цитируемый пост)
NULL, 17
и где там A.uni = 17?
PS: делай либо в условии объединения или Where B.uni = 17.

Автор: pavelv 11.9.2008, 08:49
Всё теперь доехал, тоесть он построил у меня всю модель выборки и потом уже в условии WHERE попробовал найти данные у кт A.uni=17, потому и NULL вернул. Я просто не так понимал порядок выполнения. Клинило, что он сначала всё выполнит(включая Where) ну а уже потом будет делать right join...всем спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)