使用sql查询删除所有级别子项

时间:2012-09-27 09:29:42

标签: sql sql-server

我有一张表格,其中列出了可以插入和删除的菜单。

结构如下: -

ID  Name                  ParentId
1  1. Home                    0
2  2. Products                0
3      a. SubProduct1         2
4      b. SubProduct2         2
5         i. Subsub           4
6         ii. ......          4
7  3. About                   0

顶级菜单ParentId始终为0,如1,2和7所示。

子级别项目的父级为ParentIdSubproduct的{​​{1}}为2。

当我删除菜单项时,应删除所有级别的子项,而不管使用SQL查询的级别如何。

可以有任意数量的级别

级别可以达到subsubsubsub ......任何数字。

2 个答案:

答案 0 :(得分:2)

这个查询怎么样:

DECLARE @DelID INT
SET @DelID=1

;WITH T(xParent, xChild)AS
(
SELECT ParentID, ChildId FROM Table WHERE ParentID=@DelID
UNION ALL
SELECT ParentID, ChildId FROM TABLE INNER JOIN T ON ParentID=xChild
)
DELETE FROM TABLE WHERE ParentID IN (SELECT xParent FROM T)

答案 1 :(得分:0)

您可以使用公用表表达式将要删除的项目中的所有层次项目添加到树的末尾

;WITH ParentChildsTree
AS
(
    SELECT ID, Name, ParentId
    FROM MenuItems
    WHERE Id = @itemToDelete
    UNION ALL
    SELECT ID, Name, ParentId
    FROM ParentChildsTree c
    INNER JOIN MenuItems t ON c.ParentId = t.Id
)
DELETE FROM MenuItems 
WHERE ID IN (SELECT ID FROM ParentChildsTree);

这是Demo

例如,如果您将参数@itemToDelete = 4传递给查询,则系统会删除包含ids 24的项目。