Я проверяю некоторые старые операторы SQL с целью их документирования и, возможно, улучшения.
СУБД Oracle
Я не понял утверждение, которое читалось так:
select ...
from a,b
where a.id=b.id(+)
Я запутался в (+)
операторе и не смог получить его ни на одном форуме ... (поиск + в кавычках тоже не помог).
Во всяком случае, я использовал «Объяснить план» SQLDeveloper и получил вывод о том HASH JOIN, RIGHT OUTER
, что и т. Д.
Будет ли какая-либо разница, если я удалю (+)
оператор в конце запроса? Должна ли база данных удовлетворять некоторым условиям (например, иметь некоторые индексы и т. Д.), Прежде чем ее (+)
можно будет использовать ?? Было бы очень полезно, если бы вы могли дать мне простое понимание или несколько хороших ссылок, где я могу прочитать об этом.
Спасибо!
sql
oracle
join
outer-join
Sekhar
источник
источник
Ответы:
Это специфическая для Oracle нотация для OUTER JOIN, потому что формат ANSI-89 (с использованием запятой в предложении FROM для разделения ссылок на таблицы) не стандартизировал OUTER-соединения.
Запрос будет переписан в синтаксисе ANSI-92 как:
Эта ссылка довольно хорошо объясняет разницу между JOIN .
Следует также отметить, что, хотя
(+)
работает, Oracle рекомендует не использовать его :источник
Оператор (+) указывает на внешнее соединение. Это означает, что Oracle по-прежнему будет возвращать записи с другой стороны объединения, даже если совпадений нет. Например, если a и b имеют emp и dept, и вы можете назначить сотрудников, не назначенных в отдел, то следующее утверждение вернет сведения обо всех сотрудниках, независимо от того, были ли они назначены в отдел.
Короче говоря, удаление (+) может иметь значение, но вы можете не заметить какое-то время в зависимости от ваших данных!
источник
В Oracle (+) обозначает «необязательную» таблицу в JOIN. Так что в вашем запросе
это ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ таблицы 'b' к таблице 'a'. Он вернет все данные таблицы «а» без потери своих данных, когда другая сторона (необязательная таблица «б») не имеет данных.
Современный стандартный синтаксис для того же запроса будет
или с сокращением для
a.id=b.id
(не поддерживается всеми базами данных):Если вы удалите (+), то это будет обычный запрос внутреннего соединения
Более старый синтаксис, как в Oracle, так и в других базах данных:
Более современный синтаксис:
Или просто:
Он будет возвращать только те данные, в которых значение «id» таблиц «a» и «b» одинаково, что означает общую часть.
Если вы хотите сделать ваш запрос Правильным
Это то же самое, что LEFT JOIN, но переключает, какая таблица является необязательной.
Старый синтаксис Oracle:
Современный стандартный синтаксис:
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
источник
На практике символ + помещается непосредственно в условный оператор и сбоку необязательной таблицы (той, которая может содержать пустые или нулевые значения в условном выражении).
источник