sql - 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_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
这怎么可能发生?
解决方案
不要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);
它的行为方式符合您的预期。
推荐阅读
- mysql - 如何使用数组打印记录集?
- php - 在 where 子句中使用带有阿拉伯语单词的 codeigniter sqlsrv 时不返回任何行
- javascript - 如何在不触发更改事件的情况下替换表单?
- c# - 基本 System.Drawing.Color 类在多次迭代后仅返回一种颜色
- kubernetes - 为什么我不能通过端口转发器连接到 Pod?
- c# - 蓝牙连接读取失败,套接字可能关闭或超时,读取 ret:-1
- powerbi - 具有动态表或其他机制的 Power Bi 和 DAX 行级安全性
- c - 如何强制链接到旧的 libc `fcntl` 而不是 `fcntl64`?
- python - 如何在 VS Code 中创建包含 django 应用程序设置的 python 控制台?
- javascript - 我想在我的下拉列表中使用 select2。这是我的代码。但它不起作用。我需要在 .cs 文件中写一些东西吗?