Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
递归删除SQL Oracle_Sql_Oracle11g - Fatal编程技术网

递归删除SQL Oracle

递归删除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

我正在寻找一种对表进行递归删除的方法。 情况是表本身有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中的数据量约为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;