我有一张这样的桌子
foo(id, parentId)
-- there is a FK constraint from parentId to id
Run Code Online (Sandbox Code Playgroud)
我需要删除所有孩子和孩子的孩子等项目.谁知道怎么办?
Ale*_*lex 11
AFAIK,SQL SERVER不喜欢级联删除层级关系.所以,你可以做两CTE(如俄德提到的)或用递归触发溶液(不知何故像这样).但我想,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
)
Run Code Online (Sandbox Code Playgroud)
首先,我们定义递归CTE,然后从[Foo]子记录开始从表中删除记录(最高Level;因此,顶部节点将在最后一个回合中删除).