【问题标题】:Union to handle NULL values联合处理 NULL 值
【发布时间】:2015-11-04 15:42:38
【问题描述】:

我需要在 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。如下所示,我不需要空值在所有输出字段的开头

 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

【问题讨论】:

  • 显示 ddl。看起来你必须使用join 而不是union
  • 要使用UNION,您需要选择相同数量的列。
  • 每个表中的记录是否以某种方式相互关联,或者每个表只有一个?
  • 表中的记录彼此不相关。它们是具有不同列的不同表

标签: sql oracle select union


【解决方案1】:

如果没有共享字段来执行传统的连接,您需要正确地对表进行排序以排列记录并采用行号作为键。

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 列)包含结果。

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      相关资源
      最近更新 更多