我有2个Informix查询,我认为应该返回相同的数据,但不会。第一个查询使用子查询作为过滤器,并且不正确地返回任何行。第二个是使用左外连接检查在子查询中使用的同一列上执行null,并正确返回正确的数据集。我错过了什么或者这是一个错误吗?
select i.invoice_date, oe.commit_no
from oe
join invoice i
on oe.invoice_no = i.invoice_no
where i.invoice_date > today - 60
and oe.commit_no not in (select commit_no from bolx)
select i.invoice_date, oe.commit_no, bolx.bol_no
from oe
join invoice i
on oe.invoice_no = i.invoice_no
left join bolx
on bolx.commit_no = oe.commit_no
where i.invoice_date > today - 60
and bolx.commit_no is null
缩写模式(这是遗留数据库,所以它有一些怪癖):
invoice
invoice_no char(9),
invoice_date date
oe
commit_no decimal(8, 0),
invoice_no char(9)
bolx
commit_no decimal(8, 0)
答案 0 :(得分:3)
任何时候我阅读" Not In ...子查询...不返回任何行"我很确定我知道答案!
我认为select commit_no from bolx
会返回一些NULL
值?
NULL
中NOT IN
的存在可确保不会返回任何结果。
foo NOT IN (bar, NULL)
相当于
foo <> bar and foo <> NULL
foo <> NULL
部分始终评估为unknown
,AND
永远不会评估为true
,除非所有条件都评估为true
。