sql - IN 和 EXISTS 的结果
问题描述
我有两个表 table_hold 和 table_pass,我使用下面的查询来找出 TAble_pass 中的任何 id 是否存在,然后从 table_hold 中删除相同的。我正在使用以下查询:
delete from Table_hold
where EXISTS ( SELECT 1 FROM Table_pass pass
WHERE id = pass.id );
它有什么问题吗?由于 table_hold 中有 Id=4,而 table_pass 中没有,所以它仍然从 table_hold 中删除。
下面是创建的虚拟表:
create table Table_pass(id1 number);
create table table_hold(id1 number);
insert into table_pass values(1);
insert into table_pass values(2);
insert into table_pass values(3);
insert into table_hold values(4);
delete from Table_hold
where EXISTS ( SELECT 1 FROM Table_pass pass
WHERE id1 = pass.id1 );
此查询删除 table_hold 中 ID 为 4 的一行
解决方案
限定所有列引用!
delete from Table_hold
where exists (select 1
from Table_pass p
where p.id = table_hold.id
);
这个子查询:
where EXISTS (SELECT 1
FROM Table_pass pass
WHERE id = pass.id
);
有参考id
。它是如何解决的?嗯,由内而外。所以这相当于:
where EXISTS (SELECT 1
FROM Table_pass pass
WHERE pass.id = pass.id
--------------------^ NOT table_hold
);
解决方案是养成限定所有列名的习惯。
推荐阅读
- apache-flink - 为什么存在 BucketingSink 时我们需要 StreamingFileSink?
- reactjs - 谷歌地图反应标记和列表
- c# - .Net MVC Core Policy 基于 JWT 的授权
- docker - 为什么我的 docker build 在 jenkins 代理上失败?
- android - 使用Android相机进行人脸检测。?
- matlab - MATLAB - 如何定义多变量目标优化
- python - 使用列表从 CVS 文件创建字典
- arrays - ARMSIM 显示单词中每个字符的十六进制
- spring - 测试覆盖率被其他测试覆盖
- swift - 类型“Int”没有下标成员?