2个应该返回相同数据但不返回相同数据的查询

时间:2011-04-21 23:02:25

标签: sql informix

我有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)

1 个答案:

答案 0 :(得分:3)

任何时候我阅读" Not In ...子查询...不返回任何行"我很确定我知道答案!

我认为select commit_no from bolx会返回一些NULL值?

NULLNOT IN的存在可确保不会返回任何结果。

foo NOT IN (bar, NULL)相当于

foo <> bar and foo <> NULL

foo <> NULL部分始终评估为unknownAND永远不会评估为true,除非所有条件都评估为true