问题描述
我想删除seconde表中所有不再引用第一个或为'NULL'的行。并在可能的情况下进行单个查询。
我想到了一个外部联接,但是由于两个表都缺少行,所以那没有用。我也不能在代码中这样做,因为对于Oracle,“ IN”查询会变得很大,而我也不能仅循环访问,因为这将花费很长时间。这就是为什么我希望可以通过一个查询来完成?
解决方法
在大多数数据库中,not exists
是受支持的解决方案:
delete from table2
where ref is null or not exists (
select 1
from table1
where table1.id = table2.ref
)
请注意,通过在子表/列table2(re)
和父表table1(id)
之间设置适当的外键,可以更简单地解决此问题:外键具有on delete cascade
等有用的功能,可以在引擎盖下为您执行此类操作。
删除语句:
DELETE FROM Table2 LEFT JOIN Table1 ON ref=id WHERE Table1.id IS NULL