1

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

结构如下: -

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 所示。

子级项目将具有ParentId其父级的前级。Subproduct有 2 作为它的parentId

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

可以有任意数量的级别

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

4

2 回答 2

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)
于 2012-09-27T09:53:50.813 回答
0

您可以使用公共表表达式来获取从要删除的项目到树 hten 末尾的所有层次结构项目

;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);

这是一个演示

例如,如果您将参数传递@itemToDelete = 4给查询,则带有 id 的项目24被删除。

于 2012-09-27T09:54:48.193 回答