在SQL Server中联接没有公共列的表

时间:2019-05-08 07:08:00

标签: sql-server tsql sql-server-2012 sql-server-2008-r2

TABLE1

ID  
----                        
1                           
2                           
3                           
4                           
5      

TABLE2

Name
----
Z
Y
X
W
V                           

预期输出:

ID              Name
-------------------------
1               NULL
2               NULL
3               NULL
4               NULL
5               NULL
NULL             Z
NULL             Y
NULL             X
NULL             W
NULL             V

我需要通过在SQL Server中使用JOINS来解决上述情况。

2 个答案:

答案 0 :(得分:5)

使用 FULL OUTER JOIN ,可以获得预期的结果。

由于没有公共字段,因此,表1中的记录都不应与表2相匹配,反之亦然。因此,也许ON 0 = 1作为连接条件也将按预期工作。 Thanks Bart Hofland

因此下面的查询也将起作用:

SELECT T1.Id, T2.[Name]
FROM Table1 T1
FULL OUTER JOIN Table2 T2 ON 0 = 1;

SELECT T1.Id, T2.[Name]
FROM Table1 T1
FULL OUTER JOIN Table2 T2 ON T2.[Name] = CAST(T1.Id AS VARCHAR(2));

带有示例数据的演示:

DECLARE @Table1 TABLE (Id INT);

INSERT INTO @Table1 (Id) VALUES
(1),                           
(2),                           
(3),                           
(4),                           
(5);  

DECLARE @Table2 TABLE ([Name] VARCHAR(1));

INSERT INTO @Table2 ([Name]) VALUES
('Z'),
('Y'),
('X'),
('W'),
('V');

SELECT T1.Id, T2.[Name]
FROM @Table1 T1
FULL OUTER JOIN @Table2 T2 ON 0 = 1;

输出:

Id      Name
-----------------
1       NULL
2       NULL
3       NULL
4       NULL
5       NULL
NULL    Z
NULL    Y
NULL    X
NULL    W
NULL    V

答案 1 :(得分:4)

我不明白您为什么要这样做,但是要获得预期的结果,您可以这样做。不过,这不是联接。

SELECT ID, NULL as NAME from Table1
UNION ALL
SELECT NULL, NAME from Table2

编辑后添加

由于该问题特别要求使用联接的解决方案,因此Arulkumar对FULL OUTER JOIN的回答更合适,并且您不必担心列数据类型是什么。