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