Оракул "(+)" Оператор
Я проверяю некоторые старые инструкции SQL с целью их документирования и, вероятно, их улучшения.
СУБД является Oracle
Я не понял утверждение, которое читалось так:
select ...
from a,b
where a.id=b.id(+)
Я запутался в (+) оператор, и не мог получить его ни на каких форумах... (поиск + в кавычках тоже не работал).
в любом случае, я использовал "объяснить план" SQLDeveloper и я получил выход, говоря, что HASH JOIN, RIGHT OUTER, так далее.
будет ли какая-то разница, если я удалю (+) оператор в конце запроса? Должна ли база данных удовлетворять некоторым условиям (например, иметь некоторые индексы и т. д.) перед (+) можно использовать?? Было бы очень полезно, если вы можете предоставить мне простое понимание, или некоторые хорошие ссылки, где я могу прочитать об этом.
спасибо!
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 " может потерять свои данные )
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 "таблицы" id " одинаковы, означает общую часть.
дополнительно: если вы хотите, чтобы ваш запрос как право присоединиться в старом формате или Современный, то он будет выглядеть следующим образом:
старый:
select a.id, b.id, a.col_2, b.col_2, ... from a,b where a.id(+)=b.idModern:
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
на практике символ + помещается непосредственно в условный оператор и на стороне необязательной таблицы (той, которая может содержать пустые или нулевые значения в пределах условного).



Comments