【发布时间】:2013-06-22 16:11:23
【问题描述】:
问题是返回包含空值的行。下面是创建表并使用示例数据填充表的 SQL 代码。
我期待下面的内容,但查询没有显示具有空值的两行。
src_t1 id1_t1 id2_t1 val_t1 src_t2 id1_t2 id2_t2 val_t2 bz z 4 a w w 100 b w w 1 a x x 200 b x x 2 yy 300数据:
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。
【问题讨论】:
-
为了调整我在其他问题中的回答中的 SQL,这里看起来像
from (select * from sample where src = 'a') t1 full outer join (select * from sample where src = 'b') t2 on t2.id1 = t1.id1 and t2.id2 = t1.id2:sqlfiddle.com/#!6/e7b1e/3 -
@hvd 谢谢。这样可行。当您知道如何操作时,如此简单。
-
@hvd 如果您将其作为答案发布,我将很乐意接受。
-
谢谢,我很感激,但我故意只将它作为评论发布:重复的问题不应该得到重复的答案,如果他们可以简单地获得指向已经在别处给出的答案的指针。 :)
标签: tsql