我正在寻找一种在表上进行递归删除的方法。 情况是该表本身有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
5, 14-07-23, null
6, 13-07-22, 2
Table2--> ID, stuff
Table3 --> ID, stuff
表2和表3的ID直接链接在表1的ID上。 表1中的数据量约为20 000 000行,其他表的数量大致相同。
这是我尝试过的请求(它在游标内部删除了返回的数据。
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;
这个请求输出我想要的数据真的很慢。 而且似乎没有返回我需要删除的数据。
编辑#1 好的,这是我需要做的一个例子(在这个例子中,我认为表2和表3在表1中没有匹配的ID)
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
在删除序列之后,如果&gt; =日期是13-12-31
,则表格必须类似Table1 --> Id1, dateOCC, ParentID
1, 13-12-26, null
3, 14-12-31, 1
5, 14-07-23, null
所以你可以看到,如果可能的话,我可以让孩子删除我可以删除的父母。如果我不能删除他的父母,因为另一个孩子存在而我无法删除它我不删除de parent(只删除我可以的孩子)。
答案 0 :(得分:0)
在分层查询中,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;
但目前尚不清楚这是否是你想要的。这将为您提供所需日期范围内的顶级父级,并且在其他表中没有子级,然后为这些父级构建整个层次结构。层次结构中较低的节点可能会在其他表中生成子节点,这会导致删除失败。
如果那不是您想要的,我认为您需要更清楚地描述您的要求。