递归删除SQL Oracle

时间:2015-07-07 11:59:46

标签: 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
               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(只删除我可以的孩子)。

1 个答案:

答案 0 :(得分:0)

在分层查询中,WHERE子句在之后应用 START WITHCONNECT 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;

但目前尚不清楚这是否是你想要的。这将为您提供所需日期范围内的顶级父级,并且在其他表中没有子级,然后为这些父级构建整个层次结构。层次结构中较低的节点可能会在其他表中生成子节点,这会导致删除失败。

如果那不是您想要的,我认为您需要更清楚地描述您的要求。