Давайте возьмем простой запрос в Oracle:
SELECT
CASE.ID,
CASE.TYPE,
CASE.DATE_RAISED
FROM
CASE
WHERE
CASE.DATE_RAISED > '2019-01-01'
Теперь, скажем, другая таблица, EVENT, содержит несколько событий, которые могут быть связаны с каждым случаем (связанным через EVENT.CASE_ID).ИЛИ не существует вообще.Я хочу сообщить о самом раннем событии в будущем для каждого случая - или, если ничего не существует, вернуть NULL.Я могу сделать это с помощью подзапроса в предложении SELECT следующим образом:
SELECT
CASE.ID,
CASE.TYPE,
CASE.DATE_RAISED,
(
SELECT
MIN(EVENT.DATE)
FROM
EVENT
WHERE
EVENT.CASE_ID = CASE.ID
AND EVENT.DATE >= CURRENT_DATE
) AS MIN_EVENT_DATE
FROM
CASE
WHERE
CASE.DATE_RAISED > '2019-01-01'
Это вернет таблицу, подобную этой:
Case ID Case Type Date Raised Min Event Date
76 A 03/01/2019 10/05/2019
43 B 02/02/2019 [NULL]
89 A 29/01/2019 08/07/2019
90 A 04/03/2019 [NULL]
102 C 15/04/2019 20/05/2019
Обратите внимание, что если не существует никаких событийкоторые соответствуют критериям, строка все еще возвращается, но без значения.Это потому, что подзапрос находится в предложении SELECT.Это работает просто отлично.
Однако моя проблема заключается в том, что я хочу вернуть более одного столбца из таблицы EVENT, при этом сохраняя при этом возможность того, что в таблице EVENT нет совпадающих строк.,Приведенный выше код возвращает только EVENT.DATE как результат одного подзапроса в ОДИН столбец основного запроса.Но что, если я также хочу вернуть EVENT.ID или EVENT.TYPE?Все еще позволяя им иметь значение NULL (если не найдено соответствующих записей из CASE)?
Я полагаю, что я мог бы использовать несколько подзапросов в предложении SELECT: каждый возвращал только ОДИН столбец.Но это кажется ужасно неэффективным, учитывая, что каждый подзапрос будет основываться на одних и тех же критериях (СОБЫТИЕ с минимальной датой, ИД CASE которого совпадает с основным запросом, или NULL, если такие события не найдены).
Я подозреваюнекоторые изящные объединения были бы ответом - хотя я изо всех сил пытаюсь понять, какие именно.
Обратите внимание, что приведенные выше примеры - это значительно упрощенные версии моего реального кода, который уже содержит несколько объединений в «старом стиле».«Формат Oracle, например:
WHERE
CASE.ID(+) = EVENT.CASE_ID
Есть причины, почему это так - поэтому просьба к любому, кто ответит на этот вопрос, пожалуйста, продемонстрируйте какие-нибудь решения в этом стиле кодирования, так как мой SQL не далекодостаточно продвинутый, чтобы иметь возможность повторно учитывать «более новый» стиль, включающий в существующий код.