Оператор Oracle «(+)»

110

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

СУБД Oracle

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

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

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

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

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

Спасибо!

  • 0
    Это не оператор. Это просто часть синтаксиса, которая влияет на то, что делает JOIN.
Теги:
join
outer-join

4 ответа

135
Лучший ответ

Это уникальная нотация 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:

  • 0
    ООО Спасибо! - Не ожидал этого вообще !!
  • 71
    Абсолютно верно. Чтобы держать (+) прямо в моей голове (левая сторона и правая сторона), мне нравится думать о (+) как о «добавлении значений NULL, если совпадение не найдено». Например, «a.id = b.id (+)» означает, что b.id должен быть NULL, если нет совпадения с a.id.
Показать ещё 2 комментария
23

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

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

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

5

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

2

В 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" может потерять свои данные) Изображение 7133

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

Изображение 7134

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

Дополнительно: если вы хотите сделать свой запрос как "Правое соединение" в более старом формате или в современном формате, он будет выглядеть так, как показано ниже:

Изображение 7135

Старый:

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

  • 0
    Метки круга "table1" и "table2" - ерунда. Простейшее значение для элементов круга - выходные строки. Тогда левый полумесяц содержит расширенные нулями строки таблицы 1, а правый полумесяц содержит расширенные нулями строки таблицы 2. Другие значения для кругов неясны. Что именно вы думаете, диаграммы означают? Почему вы вставили их, кроме слепого копирования (плохих) презентаций других людей?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню