SQL:删除所有嵌套的自引用记录

标签 sql sql-server sql-server-2008

这是表的结构:Id Name ParentId

ParentId 是主列 Id 的外键。现在假设我有几行,例如:(仅显示行中的 ParentId)

     01
   /    \
  5      2
        / \
       3   4

我设置了 InsteadOfDelete 触发器,如下所示:

CREATE TRIGGER [dbo].[tr_tb] ON [dbo].[Some_tb]
    INSTEAD OF DELETE 
AS 
    /*Delete from another table*/
    DELETE FROM SomeOther_tb WHERE OtherId IN(SELECT Id FROM deleted);

    /*Delete childs from this table*/
    DELETE FROM Some_tb WHERE ParentId IN(SELECT Id FROM deleted);

    /*Delete from this table*/
    DELETE FROM Some_tb WHERE Id IN(SELECT Id FROM deleted);

当删除 Id = 01 的记录时(检查上面子项的表示)。仅删除直接子项 (Id=5,2),留下子子项记录 (Id = 3,4)。

我假设 InsteadOfTrigger 函数不会为子项触发 (Id=5,2)。

如何解决此问题,以便删除所有嵌套的子级?

最佳答案

CREATE TRIGGER [dbo].[tr_tb] ON [dbo].[Some_tb]
    INSTEAD OF DELETE 
AS 
    DECLARE @DELETED TABLE(
        ID BIGINT
    )

    INSERT INTO @DELETED
        SELECT Id FROM deleted

    --could use a CTE here as well for better performance
    WHILE @@ROWCOUNT>0
        BEGIN
            INSERT INTO @DELETED
                SELECT Id
                FROM Some_tb t
                inner join @DELETED d on d.parentid=t.id
        END

    /*Delete from another table*/
    DELETE FROM SomeOther_tb WHERE OtherId IN(SELECT Id FROM @DELETED);

    /*Delete childs from this table*/
    DELETE FROM Some_tb WHERE ParentId IN(
       SELECT Id FROM @DELETED WHERE ID NOT IN (SELECT ID FROM DELETED)
    );

    /*Delete from this table*/
    DELETE FROM Some_tb WHERE Id IN(SELECT Id FROM DELETED);

关于SQL:删除所有嵌套的自引用记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38400660/

相关文章:

sql - 使用 SSIS 将表数据的 XML 表示形式提取到文件中

r - R : invalid object name 中的 dbReadTable 错误

sql - 如何识别包含动态sql的存储过程

sql-server - 数据库开发人员为什么要使用 LINQ

sql-server - SQL Server 计数

sql-server-2008 - 尝试创建新的 SQL Server 2008 数据库项目时出错

sql-server - 在SQL Server 2005中,如何获取 View 所依赖的其他数据库中的表?

sql - pl/sql 引用异常

php - 有没有更好的或替代的方法来编写我的 SQL 查询?

mysql - UNION 显示用于获取数据库中的所有字段,information_schema 不可用