我有一张表格,其中列出了可以插入和删除的菜单。
结构如下: -
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
的{{1}}为2。
当我删除菜单项时,应删除所有级别的子项,而不管使用SQL查询的级别如何。
可以有任意数量的级别
级别可以达到subsubsubsub ......任何数字。
答案 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);
例如,如果您将参数@itemToDelete = 4
传递给查询,则系统会删除包含ids 2
和4
的项目。