我有这样SQL:删除子树表(ID,PARENTID),删除一个项目,他所有的孩子
foo(id, parentId)
-- there is a FK constraint from parentId to id
一个表,我需要他的所有孩子和孩子删除项目儿童等 任何人都知道如何?
我有这样SQL:删除子树表(ID,PARENTID),删除一个项目,他所有的孩子
foo(id, parentId)
-- there is a FK constraint from parentId to id
一个表,我需要他的所有孩子和孩子删除项目儿童等 任何人都知道如何?
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
;所以,顶节点将在最后一圈被删除)。
您可以编写一个recursive CTE,锚点将是最初的Id。
好点。已经掩盖了我的答案! – 2010-05-07 09:31:07
什么是百分之百最好的东西?它会删除前100行吗? – Omu 2010-05-07 11:20:54
@欧姆,不。 “TOP 100 PERCENT”意味着所有的记录。没有它,你会得到'ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中是无效的,除非TOP或FOR XML也被指定。所以这只是一个解决方法。 – Alex 2010-05-07 11:27:33