Sql server 如何在没有公共列的情况下使用SQL连接两个表
例如: 表1:Sql server 如何在没有公共列的情况下使用SQL连接两个表,sql-server,Sql Server,例如: 表1: Column1 Column2 ----------- ------------- A 1 B 2 D 3 E 4 表2: Column3 Column4 ----------- ------------- A 7 E 9 Z
Column1 Column2
----------- -------------
A 1
B 2
D 3
E 4
表2:
Column3 Column4
----------- -------------
A 7
E 9
Z 5
预期产出:
Column1 Column2 Column3 Column4
----------- ------------- ------------- -------------
A 1 A 7
B 2 E 9
D 3 Z 5
E 4 NULL NULL
我希望输出如图所示
如果有两个表的列为Column1,Coumn2和Column3,Column4,
然后,预期的输出应该是Column1、Column2、Column3、Column4,而不包含任何联接。它应该在表1列的右侧有表2列。如果每个表中的行数不匹配,空值将消耗空行。您可以使用
行数
窗口函数创建可用于将两个表连接在一起的计算字段:
SELECT t1.Column1, t1.Column2, t2.Column3, t2.Column4
FROM (
SELECT Column1, Column2,
ROW_NUMBER() OVER (ORDER BY Column1) AS rn
FROM Table1) AS t1
FULL OUTER JOIN (
SELECT Column3, Column4,
ROW_NUMBER() OVER (ORDER BY Column3) AS rn
FROM Table2) AS t2
ON t1.rn = t2.rn
如果表1
或表2
有更多行,则需要完全外部联接。这将起作用:-
SELECT Column1, Column2, Column3, Column4 FROM
(SELECT ROW_NUMBER() OVER(ORDER BY Column1) row, Table1.*
FROM Table1) t1
FULL OUTER JOIN (SELECT ROW_NUMBER() OVER(ORDER BY Column3) row, Table2.*
FROM Table2) t2
ON t1.row = t2.row
或者,您也可以执行左联接
而不是完全外部联接
:
SELECT Column1
,Column2
,t.Column3
,t.Column4
FROM (
SELECT ROW_NUMBER() OVER (
ORDER BY Column1
) rn
,Table1.*
FROM Table1
) t1
LEFT JOIN (
SELECT ROW_NUMBER() OVER (
ORDER BY Column3
) AS rn
,t2.*
FROM Table2 t2
) t ON t1.rn = t.rn;
注意:当然,只有在表A
中有更多记录时,才可以使用Row_number()函数向每个表中添加RowNumber。然后只需将RowNumber列上的两个表连接起来。您可以使用完全外部联接,或者如果您知道哪个表将有更多的行,那么您可以使用左侧或右侧外部联接帮助中的任何内容?如果Table1
的行数少于Table2
,这将不起作用。啊-很好地发现了…抱歉,漫长的一天!