Оператор Oracle ((+)) - PullRequest
       27

Оператор Oracle ((+))

142 голосов
/ 26 октября 2010

Я проверяю некоторые старые операторы SQL с целью их документирования и, возможно, улучшения.

СУБД Oracle

Я не понял утверждения, которое читалось так:

select ...
from a,b
where a.id=b.id(+)

Я запутался в операторе (+) и не смог получить его ни на одном форуме ... (поиск + в кавычках тоже не помог).

В любом случае, я использовал 'Explain Plan' SQLDeveloper и получил вывод о том, что HASH JOIN, RIGHT OUTER и т. Д.

Будет ли какая-либо разница, если я уберу оператор (+) в конце запроса? Должна ли база данных удовлетворять некоторым условиям (например, иметь некоторые индексы и т. Д.), Прежде чем можно будет использовать (+)? Было бы очень полезно, если бы вы могли дать мне простое понимание или несколько хороших ссылок, где я могу прочитать об этом.

Спасибо!

Ответы [ 4 ]

170 голосов
/ 26 октября 2010

Это специфическая для Oracle нотация для OUTER JOIN, потому что формат ANSI-89 (использование запятой в предложении FROM для разделения ссылок на таблицы) не стандартизировал OUTER-соединения.

Запрос будет переписан в синтаксисе ANSI-92 следующим образом:

   SELECT ...
     FROM a
LEFT JOIN b ON b.id = a.id

Эта ссылка довольно хорошо объясняет разницу между JOIN .


Следует также отметить, что, хотя (+) работает, Oracle рекомендует не , используя его :

Oracle рекомендует использовать синтаксис FROM clause OUTER JOIN вместо оператора соединения Oracle. На запросы внешнего соединения, использующие оператор соединения Oracle (+), распространяются следующие правила и ограничения, которые не применяются к синтаксису FROM clause OUTER JOIN:

26 голосов
/ 26 октября 2010

Оператор (+) указывает на внешнее соединение.Это означает, что Oracle по-прежнему будет возвращать записи с другой стороны объединения, даже если совпадений нет.Например, если a и b имеют emp и dept, и вы можете назначить сотрудников, не назначенных в отдел, то следующее утверждение вернет сведения обо всех сотрудниках независимо от того, были ли они назначены в отдел.Короче говоря, удаление (+) может иметь значение, но вы можете не заметить какое-то время в зависимости от ваших данных!

21 голосов
/ 30 октября 2017

В Oracle (+) обозначает «необязательную» таблицу в JOIN.Таким образом, в вашем запросе

SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id(+)

это левое внешнее соединение таблицы 'b' с таблицей 'a'.Он вернет все данные таблицы «а» без потери данных, когда другая сторона (необязательная таблица «б») не имеет данных.

Diagram of Left Outer Join

Современный стандартный синтаксис для того же запроса будет

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b ON a.id=b.id

или с сокращением для a.id=b.id (поддерживается не всеми базами данных):

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b USING(id)

Если удалить (+)тогда это будет обычный запрос внутреннего соединения

Более старый синтаксис в Oracle и других базах данных:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id

Более современный синтаксис:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
INNER JOIN b ON a.id=b.id

Или просто:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
JOIN b ON a.id=b.id

Diagram of Inner Join

Он будет возвращать все данные только в том случае, если оба значения идентификаторов таблиц a и b одинаковы, что означает общую часть.

Если вы хотите сделать свой запрос правым соединением

Это то же самое, что левое соединение, но переключает, какая таблица является необязательной.

Diagram of Right Outer Join

Старый синтаксис Oracle:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id(+)=b.id

Современный стандартный синтаксис:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
RIGHT JOIN b ON a.id=b.id

Справка и справка:

https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187

Левое внешнее объединение с использованием знака + в Oracle 11g

https://www.w3schools.com/sql/sql_join_left.asp

6 голосов
/ 02 августа 2017

На практике символ + помещается непосредственно в условный оператор и сбоку необязательной таблицы (той, которая может содержать пустые или нулевые значения в условном выражении).

...