【发布时间】:2011-03-04 16:06:39
【问题描述】:
假设 Oracle 10G 中有两个表
TableA (Parent) --> TableB (Child)
TableA 中的每一行在 TableB 中都有几个与其相关的子行。
我想删除 TableA 中的特定行,这意味着我必须先删除 tableB 中的相关行。
这会删除子条目
delete from tableB where last_update_Dtm = sysdate-30;
要删除子表中刚刚删除的行的父行,我可以这样做
Delete from TableA where not exists (select 1 from tableB where tableA.key=tableB.key);
以上内容还将删除子表中 (last_update_Dtm = sysdate-30) 为 false 的行。 TableA 没有 last_update_dtm 列,因此如果没有子表中的条目,就无法知道要删除哪些行。
我可以在删除之前将键保存在子表中,但这似乎是一种昂贵的方法。删除两个表中的行的正确方法是什么?
编辑
为了更好地解释我想要实现的目标,如果两个表之间没有约束,以下查询将完成我想要做的事情。
Delete from tableA
Where exists (
Select 1 from tableB
where tableA.key=tableB.key
and tableB.last_update_dtm=sysdate-30)
Delete from tableB where last_update_dtm=systdate-30
【问题讨论】:
-
请注意,sysdate 的测量精度为 1/100 秒。因此,在 2011-03-04 10:01:32.05 运行删除只会删除时间戳为 2011-02-06 10:01:32.05 的记录。我猜这不是你想要的。我希望您想要更像“如果在过去 30 天内没有更新的孩子,则删除父母”。这更像是“不存在的地方(从 tableB 中选择 1 ... and last_update_dtm > sysdate - 30)”。