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

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

СУБД Oracle

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

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

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

Во всяком случае, я использовал "Объяснить план" SQLDeveloper и получил вывод о том, что HASH JOIN, RIGHT OUTER, так далее.

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

Спасибо!

4 ответа

Решение

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

Запрос будет переписан в синтаксисе ANSI-92 как:

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

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


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

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

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

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

это таблица LEFT OUTER JOIN 'b' с таблицей 'a'. Как и в случае современного левого соединения. (он вернет все данные таблицы 'a' без потери своих данных, с другой стороны необязательная таблица 'b' может потерять свои данные)

select  a.id, b.id, a.col_2, b.col_2, ...
from a
Left join b ON a.id=b.id

ИЛИ ЖЕ

select  a.id, b.id, a.col_2, b.col_2, ...
from a
Left join b using(id)

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

select  a.id, b.id, a.col_2, b.col_2, ...
from a,b
where a.id=b.id

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

Дополнительно: если вы хотите сделать запрос правым соединением в старом или современном формате, он будет выглядеть следующим образом:

Старый:

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

ИЛИ ЖЕ

select  a.id, b.id, a.col_2, b.col_2, ...
from a
Right join b using(id)

Ref & help:

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

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

select * from emp, dept where emp.dept_id=dept.dept_id(+)

Короче говоря, удаление (+) может иметь значение, но вы можете не заметить какое-то время в зависимости от ваших данных!

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

Другие вопросы по тегам