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

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

СУБД Oracle

Я не понял выражение, которое читается следующим образом:

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

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

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

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

Спасибо!

Ответ 1

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

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

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

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


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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

В 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

введите описание изображения здесь

он будет возвращать только все данные, где значения идентификатора "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)

Справка и помощь:

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

Left Outer Join с использованием знака + в Oracle 11g

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