我有以下两个表T1和T2。
表T1
Id Value1
1 2
2 1
3 2
表T2
Id Value2
1 3
2 1
4 1
我需要一个SQL SERVER查询来返回以下内容
Id Value1 Value2
1 2 3
2 1 1
3 2 0
4 0 1
提前致谢!!
答案 0 :(得分:1)
您可以通过完整外部加入并使用 ISNULL
来实现此目的使用给定的样本数据执行:
DECLARE @Table1 TABLE (Id INT, Value1 INT)
INSERT INTO @Table1 VALUES (1, 2), (2, 1), (3, 2)
DECLARE @Table2 TABLE (Id INT, Value2 INT)
INSERT INTO @Table2 VALUES (1, 3), (2, 1), (4, 1)
SELECT ISNULL(T1.Id, T2.Id) AS Id,
ISNULL(T1.Value1, 0) AS Value1,
ISNULL(T2.Value2, 0) AS Value2
FROM @Table1 T1
FULL OUTER JOIN @Table2 T2 ON T2.Id = T1.Id
结果:
Id Value1 Value2
1 2 3
2 1 1
3 2 0
4 0 1
答案 1 :(得分:0)
仅供参考 - Merge
表示SQL Server中存在不同的内容。
我建议如果你有一个包含所有可能Id值列表的表,我会从中选择所有内容,并有两个左外连接到T1和T2。
假设没有一个,只有提供的内容,听起来你想要一个完整的外部联接。
这样的事情应该有效:
SELECT Id = COALESCE(T1.Id, T2.Id),
Value1 = COALESCE(T1.Value1, 0),
Value2 = COALESCE(T2.Value2, 0)
FROM T1
FULL OUTER JOIN T2
ON T1.ID = T2.ID
答案 2 :(得分:0)
这是一个基本的FULL OUTER JOIN
:
SELECT coalesce(t1.id,t2.id) as [ID],
coalesce(t1.value1,0) as Value1,
coalesce(t2.value2,0) as Value2
FROM t1
FULL OUTER JOIN t2
ON(t1.id = t2.id)
这会将两个表连接在一起,即使没有匹配也会保留两个表的记录。
由于完全连接,COALESCE()
用于替换空值。
答案 3 :(得分:0)
请试试这个。它与SQL Server 2012一起正常工作。
--Create two temp tables
CREATE TABLE #temp1
(Id int,Value1 int)
CREATE TABLE #temp2
(Id int,Value2 int)
--Insert Values to two tables
INSERT INTO #temp1
(Id,Value1)
VALUES
(1,2),(2,1),(3,3)
INSERT INTO #temp2
(Id,Value2)
VALUES
(1,3),(2,1),(4,1)
--Query which gives desired output
SELECT
ID = COALESCE(#temp1.Id, #temp2.Id),
Value1 = COALESCE(#temp1.Value1, 0),
Value2 = COALESCE(#temp2.Value2, 0)
FROM
#temp1 FULL JOIN #temp2 ON #temp1.Id = #temp2.Id
答案 4 :(得分:0)
以下是完全加入的一般语法。
SELECT column-names
FROM Table1 FULL OUTER JOIN Table2
ON column-name1 = column-name2
WHERE condition