erge
@erge
Примус починяю

Как объединить подзапросы?

Всем доброго!

Есть два подзапроса, отбирают набор по определенным критериям, типа
select
    id, dt_beg, dt_end
  from ...................
  where ..............


нужно отбирать данные из второго если там не нулл записи, если нулл, то из первого, так изначально думал (ошибочно), думая, что первый никогда не будет возвращать нулл записи, поэтому к нему лефтджойнил второй по id

примерно так:

SELECT
    ao.id,
    DECODE(NVL(an.id,0), 0,ao.dt_beg, an.dt_beg) AS dt_beg,
    DECODE(NVL(an.id,0), 0,ao.dt_end, an.dt_end) AS dt_end
  FROM
  (.....) ao, (.....) an
  WHERE ao.id = an.id(+)
    AND ao.id = _NUMBER_
;


Но, оказалось, есть ситуации, когда первый возвращает NULL, в это время второй не NULL
и как раз данные со второго приоритетнее, т.е. если они не NULL то именно их и надо подставить.

попробовал сделать FULL OUTER JOIN
но ничего не выбирается, хотя во втором запросе точно есть данные. :-/

SELECT
    ao.id,
    DECODE(NVL(an.id,0), 0,ao.dt_beg, an.dt_beg) AS dt_beg,
    DECODE(NVL(an.id,0), 0,ao.dt_end, an.dt_end) AS dt_end
  FROM
  (.....) ao
  FULL OUTER JOIN (.....) an ON ao.id = an.id
  WHERE ao.id = _NUMBER_ OR an.id = _NUMBER_
;


как правильно объединить и отобрать данные?
  • Вопрос задан
  • 838 просмотров
Решения вопроса 1
erge
@erge Автор вопроса
Примус починяю
PS: извиняюсь, поспешил, таки пропустил... по параметрам что выбрал, оба запроса были пустые.

Все работает:

SELECT
    DECODE(NVL(an.id,0), 0,ao.id, an.id) AS id,
    DECODE(NVL(an.id,0), 0,ao.dt_beg, an.dt_beg) AS dt_beg,
    DECODE(NVL(an.id,0), 0,ao.dt_end, an.dt_end) AS dt_end
  FROM
  (.....) ao
  FULL OUTER JOIN (.....) an ON ao.id = an.id
  WHERE (an.id is null OR ao.id is null)
    AND (ao.id = _NUMBER_ OR an.id = _NUMBER_)
;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы