Использование (+) в WHERE в Oracle: проясняем синтаксис
Быстрый ответ
В Oracle обозначение (+)
рядом с наименованием столбца в условии WHERE
служит для реализации левостороннего внешнего соединения (left outer join). Этот синтаксис помогает получить все записи из первой таблицы, сопоставив их с подходящими записями из второй таблицы. Если во второй таблице нет совпадений, в результате вернётся значение null. Несмотря на это, сегодня предпочтение отдаётся современному синтаксису ANSI LEFT OUTER JOIN
, который улучшает читаемость кода и соответствует стандартам.
Пример, использующий устарелый синтаксис Oracle (+)
:
-- "По старинке, как в доброй старой Oracle!"
SELECT e.name, d.name
FROM employees e, departments d
WHERE e.department_id = d.id(+);
Пример с применением современного синтаксиса ANSI:
-- "Открываем для себя будущее с 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.
Визуализация
Аналогия с железнодорожным вокзалом поможет наглядно понять принцип работы:
Основной путь А (🛤️): [Поезд A1, Поезд A2]
Путевой участок В (🛤️): [Поезд B2, Поезд B3]
Применение (+)
в предложении WHERE
можно сравнить с действием железнодорожной стрелки:
Основной путь (A) Путевой участок (B)
[🚂]---(+)---[ ]
Когда срабатывает (+)
:
- Он соединяет поезда с основного пути А с их аналогами на пути В.
- Если на пути В нет пары, пустой вагон (🚃) символизирует значение null:
Соединенные пары поездов:
[🚂 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 отдаётся предпочтение за его ясность и удобство. Практика — лучший помощник при освоении!
Полезные материалы
- Joins – Oracle Documentation — Официальная документация Oracle по соединениям JOIN.
- Outer join – Oracle FAQ — Подробное объяснение применения синтаксиса Oracle
(+)
для внешних соединений. - Difference between Oracle's plus (+) notation and ANSI JOIN? – Stack Overflow — Обсуждение разных аспектов синтаксиса Oracle
(+)
и ANSI JOIN. - SELECT – Oracle Database SQL Reference — Официальное руководство Oracle по использованию SQL SELECT, включая соединения.
- How to read the SD Card ID number? – Stack Overflow — Не относится к данной теме, но может быть полезно для разработчиков на Android.