删除不再有参考的行

问题描述

我想删除seconde表中所有不再引用第一个或为'NULL'的行。并在可能的情况下进行单个查询

Visual Representation

我想到了一个外部联接,但是由于两个表都缺少行,所以那没有用。我也不能在代码中这样做,因为对于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