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

ParentId1、2、および 7 に表示されているように、最上位メニューは常に 0 です。

子レベルのアイテムはParentId、例として親を持っています。Subproductは として 2 を持っていますparentId

メニュー項目を削除すると、SQLクエリを使用してレベルに関係なく、すべてのレベルの子項目を削除する必要があります。

レベルはいくつあってもよい

レベルは、サブサブサブサブ……任意の数まで上げることができます。

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をクエリに渡すと、ID2を持つアイテム4が削除されます。

于 2012-09-27T09:54:48.193 に答える