联合处理NULL值

时间:2015-08-12 07:09:35

标签: sql oracle select union

我需要在Oracle SQL中编写如下查询:

select a,b,null,null from table1      
union    
select null,null,c,d from table2    
union     
select null,null,null,null,e,f from table3

我期待输出如下:

a,b,c,d,e,f

编辑:抱歉我不得不更新这个问题,因为我问的原始问题与我期待的输出不匹配。

我有如下表格:

TABLE1
---------
 A  | B
---------
 A1 | B1
 A2 | B2
 A3 | B3


TABLE2
---------
 C  | D
---------
 C1 | D1
 C2 | D2
 C3 | D3
 C4 | D4
 C5 | D5


TABLE3
---------
 E  | F
---------
 E1 | F1
 E2 | F2
 E3 | F3
 E4 | F4
 E5 | F5
 E6 | F7
 E7 | F8

我不知道如何编写一个Oracle sql来获取下面的输出。如下所示,我不需要将null值置于所有输出字段的开头

 A        B       C       D       E        F
------- ------- ------- -------- -------- -------
 A1      B1      C1      D1       E1       F1
 A2      B2      C2      D2       E2       F2
 A3      B3      C3      D3       E3       F3
 null    null    C4      D4       E4       F4
 null    null    C5      D5       E5       F5
 null    null    null    null     E6       F7
 null    null    null    null     E7       F8

2 个答案:

答案 0 :(得分:2)

union之后添加来自不同表格的行,然后删除重复项。为了获得您期望的输出,您应该使用连接。 如果您有任何键,则会在表之间创建逻辑关系:

SELECT a, b, c, d, e, f
FROM   table1
JOIN   table2 ON table1.id = table2.t1_id
JOIN   table3 ON table2.id = table3.t2_id

如果你没有(或者如果每个表确实只包含一行),你可以使用cross join

SELECT     a, b, c, d, e, f
FROM       table1
CROSS JOIN table2
CROSS JOIN table3

答案 1 :(得分:0)

如果没有共享字段来执行传统连接,则需要正确排序表以排列记录并将行号作为键。

CREATE VIEW V1 (A,B,I) AS SELECT a,b,ROWNUM FROM table1 ORDER BY something 
CREATE VIEW V2 (C,D,I) AS SELECT c,d,ROWNUM FROM table2 ORDER BY something 
CREATE VIEW V3 (E,F,I) AS SELECT e,f,ROWNUM FROM table3 ORDER BY something 

然后你可以加入表格(为简单起见,一次两个):

CREATE VIEW V1_2 (A,B,C,D,I) AS SELECT 
    v1.a,v1.b,
    v2.c,v2.d, 
    NVL(v1.i,v2.i)
FROM v1 full outer join v2 on v1.i=v2.i 

CREATE VIEW V1_2_3 (A,B,C,D,E,F,I) AS SELECT 
    v1_2.a,v1_2.b,v1_2.c,v1_2.d, 
    v3.e,v3.f,
    NVL(v1_2.i,v3.i)
FROM v1_2 full outer join v3 on v1_2.i=v3.i

v_1_2_3(不严格需要第i列)包含结果。