这个问题在这里已经有了答案:
SQL Full Outer Join on same column in same table
(1 个回答)
8年前关闭。
问题是返回包含空值的行。下面是用于创建表并用示例数据填充它的 SQL 代码。
我在下面期待,但查询没有显示具有空值的两行。
src_t1 id1_t1 id2_t1 val_t1 src_t2 id1_t2 id2_t2 val_t2 b z z 4 a w w 100 b w w 1 a x x 200 b x x 2 a y y 300
Data:
CREATE TABLE sample (
src VARCHAR(6)
,id1 VARCHAR(6)
,id2 VARCHAR(6)
,val FLOAT
);
INSERT INTO sample (src, id1, id2, val)
VALUES ('a', 'w', 'w', 100)
,('b', 'w', 'w', 1)
,('a', 'x', 'x', 200)
,('b', 'x', 'x', 2)
,('a', 'y', 'y', 300)
,('b', 'z', 'z', 4)
;
这是我的测试查询。当 t1.src = 'a' 和 t1.id1 = 'y' 或 t2.src = 'b' 和 t2.id1 = 'z' 时,它不显示结果。
为什么?
什么是正确的查询?
SELECT t1.src, t1.id1, t1.id2, t1.val
,t2.src as src2, t2.id1, t2.id2, t2.val
FROM sample t1 FULL OUTER JOIN sample t2
ON t1.id1 = t2.id1 AND t1.id2 = t2.id2
WHERE (t1.src = 'a' AND t2.src = 'b')
OR (t1.src IS NULL AND t1.id1 IS NULL AND t1.id2 IS NULL)
OR (t2.src IS NULL AND t2.id1 IS NULL AND t2.id2 IS NULL)
我也试过在
WHERE
中移动条件条款给 ON
条款也是如此。TIA。
最佳答案
WHERE 子句评估太晚,有效地将您的查询转换为内部联接。
相反,使用正确的 JOIN 语法编写这样的查询:
SELECT t1.src, t1.id1, t1.id2, t1.val
,t2.src as src2, t2.id1, t2.id2, t2.val
FROM (
select * from sample
where src='a'
) t1 FULL OUTER JOIN (
select * from sample
where src='b'
) t2
ON t1.id1 = t2.id1 AND t1.id2 = t2.id2
产生这个结果集:
src id1 id2 val src2 id1 id2 val
---- ---- ---- ----------- ---- ---- ---- -----------
a w w 100 b w w 1
a x x 200 b x x 2
NULL NULL NULL NULL b z z 4
a y y 300 NULL NULL NULL NULL
更新 :
还要注意使用两个子查询将源表清楚地分成两个不同的相关变量。我第一次提交时错过了这一分钟。
关于tsql - 完全外部自联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17252719/