Оператор (+) при соединении таблиц по нескольким столбцам
Столкнулся со старым оракловым кодом и не вполне понял механику оператора (+). Самый простой случай
SELECT *
FROM A, B
WHERE A.COL1 = B.COL1(+)
Для понимания легко преобразуется в
SELECT *
FROM A
LEFT JOIN B ON A.COL1 = B.COL1
При джойне по нескольким столбцам запрос
SELECT *
FROM A, B
WHERE A.COL1 = B.COL1(+)
AND A.COL2 = B.COL2(+)
Преобразуется в
SELECT *
FROM A
LEFT JOIN B ON A.COL1 = B.COL1
AND A.COL2 = B.COL2
А как понимать следующий запрос, когда не все столбцы помечены оператором (+)?
SELECT *
FROM A, B
WHERE A.COL1 = B.COL1(+)
AND A.COL2 = B.COL2
Будет ли (+) вообще учитываться в данном запросе? В эксперементе с небольшой выборкой у меня выходит, что (+) игнорируется и можно интерпретировать как полностью внутренний джойн. Но его точно нельзя понимать как:
SELECT *
FROM A, B
WHERE (A.COL1 = B.COL1 OR B.COL1 IS NULL)
AND A.COL2 = B.COL2
Ответы (1 шт):
Цитата из документации:
Outer Joins
[...] or apply the outer join operator (+) to all columns of B in the join condition in the WHERE clause.
То есть, в следующем запросе:
SELECT *
FROM A, B
WHERE A.COL1 = B.COL1(+)
AND A.COL2 = B.COL2
Если не все столбцы помечены оператором (+), следует понимать:
- что это
INNER JOIN. - кто-то допустил ошибку забыв убрать лишний оператор (+) из условия соединения.