我需要在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
答案 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列)包含结果。