IN和EXISTS的结果

Man*_*val 1 sql oracle

我有两个表table_hold和table_pass,我在下面的查询中查找TAble_pass中是否存在任何ID,然后从table_hold中删除该ID。我正在使用以下查询:

delete from Table_hold
        where  EXISTS ( SELECT 1 FROM Table_pass pass
            WHERE id = pass.id );
Run Code Online (Sandbox Code Playgroud)

这有什么问题吗?由于table_hold中的Id = 4,而table_pass中的Id = 4,因此仍从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 );
Run Code Online (Sandbox Code Playgroud)

此查询在table_hold中删除ID为4的一行

Gor*_*off 5

限定所有列引用!

delete from Table_hold
    where exists (select 1
                  from Table_pass p
                  where p.id = table_hold.id
                 );
Run Code Online (Sandbox Code Playgroud)

此子查询:

where EXISTS (SELECT 1
              FROM Table_pass pass
              WHERE id = pass.id
             );
Run Code Online (Sandbox Code Playgroud)

有参考id。如何解决?好,由内而外。因此,这等效于:

where EXISTS (SELECT 1
              FROM Table_pass pass
              WHERE pass.id = pass.id
--------------------^ NOT table_hold
             );
Run Code Online (Sandbox Code Playgroud)

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