Оракул "(+)" Оператор



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



СУБД является Oracle



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



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


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



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



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



спасибо!

675   4  

4 ответов:

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

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

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

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


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

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

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

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

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

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

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

это левая внешняя таблица соединения 'b' с таблицей 'a'. Как и современный запрос на левое соединение. ( он возвращает все данные таблицы " a "без потери своих данных на другой стороне необязательная таблица" b " может потерять свои данные ) enter image description here

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

enter image description here

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

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

enter image description here

старый:

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

Modern:

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 & справка:

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

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

Comments

    Ничего не найдено.