Условное объединение в запросе Oracle - PullRequest
0 голосов
/ 13 июля 2020

У меня есть запрос, который дает мне 2 столбца,

select

    name as name,
    code as code
    
from
    table1
    
UNION
    
select

    name as name,
    code as code
    
from
    table2

Я хотел бы применить еще одно объединение в результате, если из приведенного выше запроса я не получил строку с name as 'Default'. Итак, если в приведенном выше запросе не было записи с именем по умолчанию, мне нужно иметь еще одно объединение с указанным выше запросом:

select
        'Default' as name,
        code as code
from
    table1
where condition = condition

Я попытался поместить первый запрос в представление и использовать функцию не существует во втором запросе, но он дает ошибка столбца не найден.

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Я так понял вопрос: строки 1–9 представляют собой образцы данных; одна из строк содержит имя Default, поэтому ваш результирующий запрос должен возвращать union -ed результат как есть :

SQL> with
  2  table1 (name, code) as
  3    (select 'Little', 1 from dual union all
  4     select 'Foot'  , 2 from dual
  5    ),
  6  table2 (name, code) as
  7    (select 'Default', 3 from dual union all   --> Default is here
  8     select 'Oracle' , 4 from dual
  9    ),
 10  -- the "original" union
 11  oriun as
 12    (select name, code from table1
 13     union
 14     select name, code from table2
 15    )
 16  select name, code from oriun
 17  union
 18  select 'Default' name, null code from table1
 19  where not exists (select null from oriun
 20                    where name = 'Default'
 21                   )
 22  order by code;

NAME          CODE
------- ----------
Little           1
Foot             2
Default          3
Oracle           4

SQL>

Но, если нет Default в эти таблицы (см. изменение, внесенное в строку №7), тогда вы получите «дополнительную» Default строку:

SQL> with
  2  table1 (name, code) as
  3    (select 'Little', 1 from dual union all
  4     select 'Foot'  , 2 from dual
  5    ),
  6  table2 (name, code) as
  7    (select 'xxx', 3 from dual union all     --> No more Default here
  8     select 'Oracle' , 4 from dual
  9    ),
 10  -- the "original" union
 11  oriun as
 12    (select name, code from table1
 13     union
 14     select name, code from table2
 15    )
 16  select name, code from oriun
 17  union
 18  select 'Default' name, null code from table1
 19  where not exists (select null from oriun
 20                    where name = 'Default'
 21                   )
 22  order by code;

NAME          CODE
------- ----------
Little           1
Foot             2
xxx              3
Oracle           4
Default

SQL>
0 голосов
/ 13 июля 2020

Когда у вас есть order by in union, вам нужно поместить его в представление или создать блок с помощью select * from (.. order by)

...