'在()'按预期工作,但不在()'才不是

时间:2018-04-01 00:27:22

标签: sql oracle

我有一个两列表(n和p),其中一半的n值存在于p中而另一半不存在。以下代码返回' NULL'而不是返回不在p。

中的n个值的一半
select  n
from bst
where n 
not in 
(
    select p from bst
)
order by n
;

但是,当关键字“不是”时,'被删除,一切都按预期工作。为什么这段代码没有返回值?

3 个答案:

答案 0 :(得分:1)

我强烈建议您使用not exists代替not in子查询:

select bst.n
from bst
where not exists select p from bst bst2 where bst2.p = bst.n)
order by bst.n

为什么呢?因为这两者并不相同。如果p的任何值为NULL,则NOT IN根本不会返回任何行。 NOT EXISTS有更多预期的行为。

当然,您可以通过在子查询中进行过滤来解决此问题:

select bst.n
from bst
where bst.n not in (select bst2.p from bst bst2)
order by bst.n;

但我认为记住使用not exists而不是not in会更容易。

答案 1 :(得分:1)

create table bst(n number, p number);

insert into bst values(null,null);
insert into bst values(2,2);
insert into bst values(null,3);
insert into bst values(4,null);
insert into bst values(5,5);
insert into bst values(11,6);
insert into bst values(null,7);
insert into bst values(13,8);
insert into bst values(14,null);
insert into bst values(15,10);

commit;

select * from bst;

输出:

N   P
 -   - 
2   2
 -  3
4    - 
5   5
11  6
 -  7
13  8
14   - 
15  10

select n from bst where n not in (select p from bst);

输出:

No rows fetched

select n from bst where n not in (select p from bst where p is not null);

输出:

N
14
15
11
4
13

答案 2 :(得分:0)

select n from bst 
where n not in
( select coalesce(p,0)     from bst )
order by n ;
如果p为null,则 Coalesce将返回0。您可以写另一个值代替0.写入不能在n中的值。