示例:
表1:
Col1 Col2
----------- -------------
A 1
B 2
D 3
E 4
表2:
Col3 Col4
----------- -------------
A 7
E 9
Z 5
表3:
Col5 Col6
----------- -------------
Y 8
预期产出:
Col1 Col2 Col3 Col4 Col5 Col6
---- ---- ---- ---- ---- ----
A 1 A 7 Y 8
B 2 E 9 NULL NULL
D 3 Z 5 NULL NULL
E 4 NULL NULL NULL NULL
我想要输出如图所示。
如果有三个表的列为Col11,Col2和Col3,Col4和Col5以及Col6 那么预期的输出应该是Col1,Col2,Col3,Col4,Col5,Col6,没有任何连接。它应该只是Table2在Table1的右侧,而Table3应该在Table2的右侧。如果行数不匹配,则Null值将占用空间。 我知道两个表的解决方案。但需要SQL查询语法为n个表。 - 提前谢谢。
答案 0 :(得分:2)
虽然我不明白你为什么要这样做,但我试图回答这个问题,作为我自己学习的练习!
感谢@ user2864740,想要使用ROW_NUMBER来合成每个表之间的公共值!
以下是查询:
SELECT
col1,
col2,
col3,
col4,
col5,
col6
FROM
(SELECT ROW_NUMBER() OVER(ORDER BY col1) AS Row,
col1, col2
FROM table1) T1
FULL OUTER JOIN
(SELECT ROW_NUMBER() OVER(ORDER BY col3) AS Row,
col3, col4
FROM table2) T2 ON T1.Row = T2.Row
FULL OUTER JOIN
(SELECT ROW_NUMBER() OVER(ORDER BY col5) AS Row,
col5, col6
FROM table3) T3 ON T1.Row = T3.Row
一个SQL小提琴演示它:http://sqlfiddle.com/#!3/6c2db/6
答案 1 :(得分:0)
当你无缘无故地加入时,你必须“做出一些事情”,在这种情况下使用row_number并加入。请注意,如果它们超过表1,这将切断table2和table3结果,以避免该更改左连接到完全外连接和笛卡尔一切。最简单的方法是:
Select Col1, Col2, Col3, Col4, Col5, Col6
From
(select Col1, Col2, ROW_NUMBER() Over (order by Col1,Col2) 'Rnk1'
From table1 ) t1
left join
(select Col3, Col4, ROW_NUMBER() Over (order by Col3,Col4) 'Rnk2'
From table1 ) t2
On t1.rnk1 = t2.rnk2
left join
(select Col5, Col6, ROW_NUMBER() Over (order by Col5,Col6) 'Rnk3'
From table3 ) t3
On t1.rnk1 = t3.rnk3