我的数据库中出现一些奇怪的数据错误。我无法找出以下查询结果如何共存。
SQL> desc errors;
Name Null? Type
----------------------------------------- -------- ----------------------------
err_letid NUMBER(20)
*some other details*
SQL> desc my_letters;
Name Null? Type
----------------------------------------- -------- ----------------------------
LET_ID NOT NULL NUMBER(10)
LET_ISSUEDTO NOT NULL NUMBER(10)
因某些错误而向人们发出一封信。并非所有错误都附在字母上。
在上表中,err_letid
是let_id
表中my_letters
的外键。
现在的问题是
SQL> select * from my_letters where let_id = 818
2 /
LET_ID LET_ISSUEDTO
---------- ------------
818 8877554
SQL> select * from errors where err_letid =818
2 /
no rows selected
SQL> select * from my_letters where let_id not in (select err_letid from errors);
no rows selected
这怎么发生?
答案 0 :(得分:0)
不要对子查询使用not in
。如果子查询中的 any 值为NULL
,则查询不返回任何行。
相反,请使用not exists
:
select l.*
from my_letters l
where not exists (select 1 from errors e where l.let_id = e.err_letid);
它的行为符合您的预期。