Оператор 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 по-прежнему будет возвращать записи с другой стороны объединения, даже если совпадений нет. Например, если a и b имеют emp и dept, и вы можете назначить сотрудников, не назначенных в отдел, то следующее утверждение вернет сведения обо всех сотрудниках, независимо от того, были ли они назначены в отдел.
select * from emp, dept where emp.dept_id=dept.dept_id(+)
Короче говоря, удаление (+) может иметь значение, но вы можете не заметить какое-то время в зависимости от ваших данных!
На практике символ + помещается непосредственно в условный оператор и сбоку необязательной таблицы (той, которая может содержать пустые или нулевые значения в условном выражении).