Oracle: Что `(+)` делает в предложении WHERE? - PullRequest
54 голосов
/ 10 января 2009

Обнаружено следующее в приложении для Oracle, которое мы переносим (обобщенно) :

SELECT
    Table1.Category1,
    Table1.Category2,
    count(*) as Total,
    count(Tab2.Stat) AS Stat
FROM Table1, Table2
WHERE (Table1.PrimaryKey = Table2.ForeignKey(+))
GROUP BY Table1.Category1, Table1.Category2

Что (+) делает в предложении WHERE? Я никогда раньше не видел, чтобы это использовалось так.

Ответы [ 3 ]

88 голосов
/ 10 января 2009

В зависимости от того, с какой стороны "=" включено "(+), оно обозначает левое или правое соединение (в данном случае это левое внешнее соединение). Это старый синтаксис Oracle, который иногда предпочтительнее людьми, которые узнали его первыми, так как им это нравится, это делает их код короче.

Лучше всего не использовать его для удобства чтения.

23 голосов
/ 10 января 2009

Как уже говорили другие, синтаксис (+) является устаревшим, проприетарным синтаксисом, который Oracle годами использовал для достижения тех же результатов, что и OUTER JOIN. Я предполагаю, что они приняли свой собственный синтаксис до того, как SQL-92 определился со стандартным синтаксисом.

Эквивалент запроса, который вы показали, с использованием стандартного синтаксиса SQL OUTER JOIN (который теперь поддерживается всеми основными реализациями СУБД) будет следующим:

SELECT
    Table1.Category1,
    Table1.Category2,
    COUNT(*) AS Total,
    COUNT(Table2.Stat) AS Stat
FROM Table1
  LEFT OUTER JOIN Table2 ON (Table1.PrimaryKey = Table2.ForeignKey)
GROUP BY Table1.Category1, Table1.Category2;

Что означает:

  • Все строки из Table1 включены в результат запроса.
  • Если в Table2 есть совпадающие строки, включите эти строки (повторяя содержимое с Table1, если в Table2 есть несколько совпадающих строк).
  • Если в Table2 нет совпадающих строк, используйте NULL для всех столбцов Table2 в результате запроса.
5 голосов
/ 10 января 2009

Это не-ANSI обозначение левого внешнего соединения. Начиная с Oracle9i, запутанный синтаксис внешнего соединения с использованием нотации (+) был заменен синтаксисом внешнего соединения ISO 99.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...