2013-09-23 8 views
0

Так что я эту таблицуПоказать запись, даже если она не существует

Col1 Col2 Col3 
A  34  X 
B  43  L 
A  36  L 

Теперь, если я запрашиваю

select * from Table1 where col1 in ('A','B','C') 

Я ожидал что-то вроде

Col1 Col2 Col3 
A  34  X 
B  43  L 
A  36  L 
C  -  - 

Можно ?

P.S: - в строке C предназначены только для того, чтобы показать, что столбец пуст.

+0

каков был результат, когда вы пытались что ?? – BWS

ответ

1

Вы можете создать вложенный тип таблицы объекта схемы:

create type T_List1 as table of varchar2(100); 

А затем построить запрос следующим образом:

select s.column_value   as col1 
     , nvl(to_char(t.col2), '-') as col2 
     , nvl(col3, '-')   as col3 
    from Table1 t 
right join table(T_List1('A', 'B', 'C')) s 
    on (t.col1 = s.column_value) 

Пример:

-- sample of data from your question 
with Table1(Col1, Col2, Col3) as(
    select 'A', 34, 'X' from dual union all 
    select 'B', 43, 'L' from dual union all 
    select 'A', 36, 'L' from dual 
) -- actual query 
select s.column_value   as col1 
     , nvl(to_char(t.col2), '-') as col2 
     , nvl(col3, '-')   as col3 
    from Table1 t 
    right join table(T_List1('A', 'B', 'C')) s --< here list your values 
    on (t.col1 = s.column_value)   -- as you would using `IN` clause 

Результат:

COL1 COL2 COL3 
------------------------ 
A  36  L  
A  34  X  
B  43  L  
C  -  - 

SQLFiddle Demo

+2

Дополнительный тип на самом деле не нужен. Вы можете использовать для этого встроенный тип: 'table (sys.odcivarchar2list ('A', 'B', 'C', 'D'))' –

0

Для этого вы можете использовать таблицу драйвера, который имеет все значения, которые вы хотите, возвращаемые в нем, а именно:

col1 
A 
B 
C 
D 
E 

Затем LEFT JOIN к столу.

SELECT * 
FROM driver d 
LEFT JOIN Table1 t 
ON d.col1 = t.col1 
WHERE d.col1 in ('A','B','C') 
0

Если вы не хотите, чтобы создать дополнительный вложенный тип таблицы, как в ответ Николая Краснова или не хотят, чтобы создать отдельную временную таблицу со строками A, B, C, то просто создать таблицу вождения с with пункта:

with driving_table(col) AS 
(
    select 'A' from dual 
    union 
    select 'B' from dual 
    union 
    select 'C' from dual 

) 
select dt.col   as col1 
    , nvl(to_char(t.col2), '-') as col2 
    , nvl(col3, '-')   as col3 
    from Table1 t 
right join driving_table dt 
    on (t.col1 = dt.col) 

http://sqlfiddle.com/#!4/112ef/2

Смежные вопросы