я рву на себе волосы по этому поводу:Проблема добавления предикаты внешнего соединения
-- misses nulls
SELECT *
FROM BASE_TABLE TAB1
FULL JOIN BASE_TABLE TAB2
USING (ANOTHER_ID)
WHERE (TAB1.ID = 6 OR TAB1.ID IS NULL)
AND (TAB2.ID = 8 OR TAB2.ID IS NULL);
-- catches nulls
SELECT *
FROM (SELECT * FROM BASE_TABLE WHERE ID = 6) TAB1
FULL JOIN (SELECT * FROM BASE_TABLE WHERE ID = 8) TAB2
USING (ANOTHER_ID);
Первый запрос теряет строки, где строка в одной или другой таблицы не существует. Почему первый запрос не выполняет внешнее соединение?
Я продолжаю думать, что у меня есть это - предложение WHERE оценивается первым, поэтому «OR IS NULL» не применяется позже, но это не имеет смысла для меня, потому что я успешно применил «IS NULL 'предикаты в прошлом для выбора строк после объединения.
Я хотел бы сделать первый запрос работы по соображениям производительности - кто-нибудь знает, в чем проблема?
Я смущен о `USING` - какой синтаксис это? Я не могу найти его в каких-либо документах, обычный SQL использует `ON TAB1.ANOTHER_ID = TAB2.ANOTHER_ID` ..? – thomaspaulb 2010-12-09 23:25:21
@littlegreen Функция Oracle с 9i. Это существенно сокращает то, что вы написали. – 2010-12-09 23:27:11
@littlegreen, djacobson: при использовании `USING (ANOTHER_ID)` он приводит только к одному столбцу с именем ANOTHER_ID (на который нельзя ссылаться по псевдониму), тогда как синтаксис `ON` приводит к обеим столбцам. – 2010-12-10 02:34:26