sql:删除子树表(id,Parentid),删除所有孩子的项目

时间:2010-05-07 07:54:25

标签: sql sql-server

我有一张这样的表

foo(id, parentId) 
-- there is a FK constraint from parentId to id

我需要删除所有孩子和孩子的孩子等项目。 谁知道怎么样?

2 个答案:

答案 0 :(得分:11)

AFAIK,SQL SERVER不喜欢级联删除级联关系。所以你可以同时做CTE(提到Oded)或带递归触发器的解决方案(某种方式像this)。但我想,CTE更容易。

请参阅,这是使用CTE的解决方案:

CREATE PROC deleteFoo 
@id bigint
as
WITH Nodes ([Id], [ParentId], [Level]) 
AS (
    SELECT  F.[Id], F.[ParentId], 0 AS [Level]
    FROM    [dbo].Foo F
    WHERE   F.[Id] = @id

    UNION ALL

    SELECT  F.[Id], F.[ParentId], N.[Level] + 1
    FROM    [dbo].Foo F
        INNER JOIN Nodes N ON N.[Id] = F.[ParentId]
)

DELETE
FROM    Foo
WHERE   [Id] IN (
    SELECT  TOP 100 PERCENT N.[Id] 
    FROM    Nodes N
    ORDER BY N.[Level] DESC
)

首先,我们定义递归CTE,然后从子记录(最高[Foo]}开始删除Level表中的记录;因此,顶部节点将在最后一个回合中删除)。

答案 1 :(得分:2)

你可以写一个recursive CTE,锚点是最初的Id。