logo

Использование (+) в WHERE в Oracle: проясняем синтаксис

Быстрый ответ

В Oracle обозначение (+) рядом с наименованием столбца в условии WHERE служит для реализации левостороннего внешнего соединения (left outer join). Этот синтаксис помогает получить все записи из первой таблицы, сопоставив их с подходящими записями из второй таблицы. Если во второй таблице нет совпадений, в результате вернётся значение null. Несмотря на это, сегодня предпочтение отдаётся современному синтаксису ANSI LEFT OUTER JOIN, который улучшает читаемость кода и соответствует стандартам.

Пример, использующий устарелый синтаксис Oracle (+):

SQL
Скопировать код
-- "По старинке, как в доброй старой Oracle!"
SELECT e.name, d.name
FROM employees e, departments d
WHERE e.department_id = d.id(+);

Пример с применением современного синтаксиса ANSI:

SQL
Скопировать код
-- "Открываем для себя будущее с ANSI стандартом внешнего соединения!"
SELECT e.name, d.name
FROM employees e
LEFT OUTER JOIN departments d ON e.department_id = d.id;

Переход к стандарту ANSI в новую эпоху баз данных

Применение ANSI SQL LEFT OUTER JOIN повышает прозрачность кода и упрощает его поддержку, обеспечивая совместимость с большинством СУБД. Стандартизированный синтаксис помогает быстрее адаптироваться к работе с различными базами данных.

Гарантированная полнота данных: мощность внешних соединений

Применение LEFT OUTER JOIN гарантирует, что в результаты запроса будут включены все записи из "основной" (левой) таблицы. Если в "вторичной" (правой) таблице не обнаружены совпадения, поля, соответствующие этой таблице, заполняются значением null.

Визуализация

Аналогия с железнодорожным вокзалом поможет наглядно понять принцип работы:

Markdown
Скопировать код
Основной путь А (🛤️): [Поезд A1, Поезд A2]
Путевой участок В (🛤️): [Поезд B2, Поезд B3]

Применение (+) в предложении WHERE можно сравнить с действием железнодорожной стрелки:

Markdown
Скопировать код
Основной путь (A)   Путевой участок (B)
[🚂]---(+)---[ ]

Когда срабатывает (+):

  • Он соединяет поезда с основного пути А с их аналогами на пути В.
  • Если на пути В нет пары, пустой вагон (🚃) символизирует значение null:
Markdown
Скопировать код
Соединенные пары поездов:
[🚂 A1 + 🚃 NULL]
[🚂 A2 + 🚂 B2]

Таким образом, благодаря внешнему соединению Oracle каждый поезд с пути А присутствуют в выборке, даже если он не имеет пары на пути В и представлен только пустым вагоном для NULL.

Позиция определяет: значение расположения (+)

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

Акцент на стандарты ANSI с Oracle9i и более поздними

С версии Oracle9i компания Oracle внедрила поддержку синтаксиса ANSI SQL 99 для внешних соединений. Владение синтаксисом ANSI JOIN пригодится как для разработчиков, работающих с кодом, написанным под старые версии Oracle, так и для тех, кто использует разнообразные системы.

Избегайте путаницы с интерпретацией (+)

Возможна путаница с интерпретацией (+) из-за его расположения в предложении WHERE. Синтаксис ANSI JOIN привязывает логические операции соединения к предложению FROM, исключая вероятность примешивания их к другим условиям запроса.

Переход с (+) Oracle к ANSI: практика использования современного стандарта

Несмотря на то что (+) и ANSI JOINS могут выполнять одинаковые функции, синтаксису ANSI отдаётся предпочтение за его ясность и удобство. Практика — лучший помощник при освоении!

Полезные материалы

  1. Joins – Oracle DocumentationОфициальная документация Oracle по соединениям JOIN.
  2. Outer join – Oracle FAQ — Подробное объяснение применения синтаксиса Oracle (+) для внешних соединений.
  3. Difference between Oracle's plus (+) notation and ANSI JOIN? – Stack Overflow — Обсуждение разных аспектов синтаксиса Oracle (+) и ANSI JOIN.
  4. SELECT – Oracle Database SQL Reference — Официальное руководство Oracle по использованию SQL SELECT, включая соединения.
  5. How to read the SD Card ID number? – Stack Overflow — Не относится к данной теме, но может быть полезно для разработчиков на Android.