Oracle数据库中的违反完整性

时间:2018-09-17 13:49:17

标签: sql oracle12c

我的数据库中出现一些奇怪的数据错误。我无法找出以下查询结果如何共存。

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_letidlet_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

这怎么发生?

1 个答案:

答案 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);

它的行为符合您的预期。