首页 > 解决方案 > Oracle 数据库中的完整性违规

问题描述

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

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

这怎么可能发生?

标签: sqloracle12c

解决方案


不要not in与子查询一起使用。如果子查询中的任何值为 ,则查询不返回任何行NULL

相反,使用not exists

select l.*
from my_letters l
where not exists (select 1 from errors e where l.let_id = e.err_letid);

它的行为方式符合您的预期。


推荐阅读