Оператор (+) при соединении таблиц по нескольким столбцам

Столкнулся со старым оракловым кодом и не вполне понял механику оператора (+). Самый простой случай

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 шт):

Автор решения: 0xdb

Цитата из документации:

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.
  • кто-то допустил ошибку забыв убрать лишний оператор (+) из условия соединения.
→ Ссылка