【问题标题】:Sql delete parent from child/delete whole treeSql 从子级删除父级/删除整个树
【发布时间】:2016-12-19 10:55:14
【问题描述】:

在循环中删除父子节点

表 1(父表)

Id  int 

表2(关系表)

Id1 int FOREIGN KEY (Id1) REFERENCES Table1 (Id)    
Id2 int FOREIGN KEY (Id2) REFERENCES Table1 (Id)

Id - Id1 one to one or one to zero relationship 
Id - Id2 one to many

表1中的数据

Id
1
2
3
4
5
6
7
8
9
10    

表2中的数据

Id1 Id2
2   1
3   1
4   2
5   2
6   4
7   4
8   5
9   5

所以它就像一棵树,根为 1

1 has two childs 2 and 3
2 has two childs 4 and 5
4 has two childs 6 and 7
5 has two childs  8 and 9
3,6,7,8,9,10 has no child

实现以下情况的最佳方法:

删除1 => 删除完整的table2和table1(表1中的10除外)

【问题讨论】:

    标签: sql sql-server triggers sql-delete cascading-deletes


    【解决方案1】:

    试试

    update table2 set id2 = null;
    delete from table1 where id <> 10;
    delete from table2;
    

    【讨论】:

    • 真实数据有数千棵树和数千个独立行。所有树都不需要删除,有些树要删除,它不适用于大数据集。抱歉 2 cmets,我无法编辑之前的评论。
    【解决方案2】:

    您可以使用Recursive CTE 来做到这一点

    ;WITH cte
         AS (SELECT Id1,
                    Id2,
                    id2 AS parent
             FROM   Yourtable
             UNION ALL
             SELECT a.Id1,
                    a.Id2,
                    b.Id2
             FROM   cte a
                    JOIN Yourtable b
                      ON a.parent = b.id1)
    SELECT *
    FROM   cte
    WHERE  parent = 1
    OPTION (maxrecursion 0)
    --DELETE FROM Yourtable
    --WHERE  id1 IN (SELECT id1
    --             FROM   cte
    --             WHERE  parent = 1)
    --OPTION (maxrecursion 0) 
    

    如果 select 返回预期结果,请评论 select 并取消评论 Delete

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多