2010-05-07 74 views

回答

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]表从一子记录开始删除记录(hightest Level;所以,顶节点将在最后一圈被删除)。

+2

好点。已经掩盖了我的答案! – 2010-05-07 09:31:07

+0

什么是百分之百最好的东西?它会删除前100行吗? – Omu 2010-05-07 11:20:54

+0

@欧姆,不。 “TOP 100 PERCENT”意味着所有的记录。没有它,你会得到'ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中是无效的,除非TOP或FOR XML也被指定。所以这只是一个解决方法。 – Alex 2010-05-07 11:27:33