我有一个两列表(n和p),其中一半的n值存在于p中而另一半不存在。以下代码返回' NULL'而不是返回不在p。
中的n个值的一半select n
from bst
where n
not in
(
select p from bst
)
order by n
;
但是,当关键字“不是”时,'被删除,一切都按预期工作。为什么这段代码没有返回值?
答案 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,则