我有一张这样的表
foo(id, parentId)
-- there is a FK constraint from parentId to id
我需要删除所有孩子和孩子的孩子等项目。 谁知道怎么样?
答案 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。