即使它不存在也要显示记录

时间:2013-09-23 19:21:51

标签: sql oracle11g

所以我有这张桌子

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行中的-只是为了表明该列为空。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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')

答案 2 :(得分:0)

如果您不想像在Nicholas Krasnov的回答中那样创建额外的嵌套表类型,或者不想创建一个包含A,B,C行的单独临时表,那么只需创建一个{{1}的驱动表}子句:

with

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