[英]Left outer join doesn't exclude when both the table have null values
我有一个要求,我必须提取左表独有的数据。 我为此使用左外连接。 但是 output 提取的数据具有 null 值,用于两个表中的连接条件中使用的变量,这是不期望的。 下面是详细情况,
表A
ID | 姓名 | 主题 |
---|---|---|
1 | 汤姆 | 数学 |
2 | 杰克 | null |
表B
ID | 姓名 | 主题 |
---|---|---|
3 | 约翰 | 科学 |
2 | 杰克 | null |
询问
SELECT *
FROM TableA
LEFT JOIN TableB
ON a.id = b.id
AND a.subject = b.subject
WHERE b.id IS NULL
AND b.subject IS NULL
预期 output
ID | 姓名 | 主题 |
---|---|---|
1 | 汤姆 | 数学 |
实际 output
ID | 姓名 | 主题 |
---|---|---|
1 | 汤姆 | 数学 |
2 | 杰克 | null |
问题是,在您的问题要求中,您似乎需要将null
视为等于(其他) null
。
这违背了null
的定义。 但是你可以达到你需要的结果——在加入条件下,改变
and a.subject = b.subject
至
and (a.subject = b.subject or (a.subject is null and b.subject is null))
在 Oracle 中,您可以更简洁地执行此操作:
and decode (a.subject, b.subject, 1) = 1
因为故意定义decode
以将两个null
视为“相等”。
如果需要,您可以对id
列执行相同操作 - 但假设它应该是两个表中的主键,则不需要它。
编辑OP 声称建议使用decode
会产生错误的结果,而显式使用or (a.subject is null and b.subject is null)
在 SQL Developer 上无限期地运行。 因此,在此编辑中,我将表明 OP 的主张都是错误的。 (我在我的 SQL Developer 副本上运行了所有内容,因此 IDE 不是问题。)
他在做什么,我们不知道,但是对于所提供的数据和给我们的查询,这两个建议都是 100% 正确的(在我们添加了 OP 查询中缺少的表别名之后,我们 select 只是来自TableA
的数据)。
测试数据:
create table tablea (id, name, subject) as
select 1, 'tom' , 'math' from dual union all
select 2, 'jack', null from dual
;
create table tableb (id, name, subject) as
select 3, 'john', 'science' from dual union all
select 2, 'jack', null from dual
;
第一个查询和结果:
SELECT a.*
FROM TableA a
LEFT JOIN TableB b
ON a.id = b.id
AND (a.subject = b.subject or (a.subject is null and b.subject is null))
WHERE b.id IS NULL
AND b.subject IS NULL
;
ID NAME SUBJECT
---------- ---- -------
1 tom math
第二次查询和结果:
SELECT a.*
FROM TableA a
LEFT JOIN TableB b
ON a.id = b.id
AND decode(a.subject, b.subject, 1) = 1
WHERE b.id IS NULL
AND b.subject IS NULL
;
ID NAME SUBJECT
---------- ---- -------
1 tom math
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.