如何使用没有Common Columns的sql连接两个以上的表

时间:2015-08-18 21:42:38

标签: sql-server

示例:

表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个表。 - 提前谢谢。

2 个答案:

答案 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