首页 > 解决方案 > 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 的一行

标签: sqloracle

解决方案


限定所有列引用!

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

解决方案是养成限定所有列名的习惯。


推荐阅读