递归删除SQL Oracle
我正在寻找一种对表进行递归删除的方法。 情况是表本身有3个外键,1个外键,另外2个外键,我想根据发生日期删除递归删除SQL Oracle,sql,oracle11g,Sql,Oracle11g,我正在寻找一种对表进行递归删除的方法。 情况是表本身有3个外键,1个外键,另外2个外键,我想根据发生日期删除 Table1 --> Id1, dateOCC, ParentID 1, 13-12-26, null 2, 13-07-18, null 3, 14-12-31, 1 4, 13-06-26, 1
Table1 --> Id1, dateOCC, ParentID
1, 13-12-26, null
2, 13-07-18, null
3, 14-12-31, 1
4, 13-06-26, 1
5, 14-07-23, null
6, 13-07-22, 2
Table2--> ID, stuff
Table3 --> ID, stuff
表2和表3的ID直接链接到表1的ID上。
表1中的数据量约为20000行,其他表中的数据量大致相同
下面是我在游标中检索的请求的一部分,该游标删除返回的数据
SELECT EO.ID,
EO.DATEOCC,
EO.PARENTID
FROM TABLE1 EO
WHERE EO.DATEOCC <= TO_DATE ('2013-12-31','YYYY-MM-DD')
AND NOT EXISTS(SELECT 1 FROM TABLE2 WHERE ID = EO.ID)
AND NOT EXISTS( SELECT 1 FROM TABLE3 WHERE ID = EO.ID)
START WITH EO.PARENTID IS NULL
CONNECT BY PRIOR EO.ID = EO.PARENTID;
删除序列之后,如果>=日期为13-12-31,则该表必须如下所示
Table1 --> Id1, dateOCC, ParentID
1, 13-12-26, null
3, 14-12-31, 1
5, 14-07-23, null
如你所见,我挖掘了孩子,如果可能的话,我可以和他的父母一起删除。如果我不能删除他的父项,因为存在另一个子项,并且我不能删除它,我不会删除父项,只删除我可以删除的子项。在分层查询中,WHERE子句应用在START WITH和CONNECT BY之后,用于构建层次结构。但从语法上来说,它是第一位的,这使得直觉上它似乎会首先被应用 如果您真正想要的是首先应用WHERE子句,然后构建层次结构,则可以使用如下子查询:
SELECT EO.ID,
EO.DATEOCC,
EO.PARENTID
FROM (
SELECT * FROM TABLE1 EO
WHERE EO.DATEOCC <= TO_DATE ('2013-12-31','YYYY-MM-DD')
AND NOT EXISTS(SELECT 1 FROM TABLE2 WHERE ID = EO.ID)
AND NOT EXISTS( SELECT 1 FROM TABLE3 WHERE ID = EO.ID)
) EO
START WITH EO.PARENTID IS NULL
CONNECT BY PRIOR EO.ID = EO.PARENTID;
但不清楚这是否是你想要的。这将为您提供所需日期范围内的顶级父级,并且在其他表中没有子级,然后为这些父级构建整个层次结构。层次结构中较低的节点可能在其他表中有子节点,这将导致删除失败
如果这不是您想要的,我想您需要更清楚地描述您的需求。您好,我想要的是选择所有没有父母或他们的父母也将被删除的事件。我也需要尊重外键约束。之后,我有一个代码来删除select返回的每一行。但是日期过滤器适用于什么?例如,在您在问题中给出的示例数据中,记录1与日期过滤器匹配,因此我认为您希望删除它;但有两条记录的父项为记录1,其中一条与日期筛选器匹配,而另一条不匹配。这是否意味着您要删除全部或全部?或者删除与日期筛选器匹配的,并将另一个更改为指向其他父级?
SELECT EO.ID,
EO.DATEOCC,
EO.PARENTID
FROM (
SELECT * FROM TABLE1 EO
WHERE EO.DATEOCC <= TO_DATE ('2013-12-31','YYYY-MM-DD')
AND NOT EXISTS(SELECT 1 FROM TABLE2 WHERE ID = EO.ID)
AND NOT EXISTS( SELECT 1 FROM TABLE3 WHERE ID = EO.ID)
) EO
START WITH EO.PARENTID IS NULL
CONNECT BY PRIOR EO.ID = EO.PARENTID;