0

次の形式のSQL Server 2008 テーブルMenuItemがあります。

 MenuItemsID     MenuType     ItemsName  ParentID     URL          Images

       1            1           Home         0         --            ---
       2            1          Product       0         ---           ----
       3            1          Catagories    0         ---            ----
       4            1          Brand         0         Brand.aspx     ----
       5            1          H1            1         ------          -----
       6            1          H2            1         ------        --------
       7            1          P1            2         ----           ------
       8            1          c1            3         ----           ---
       9            1          H1Submneu1    5         ---               ----
       10           1           P1 subMenu   7         -------           ---

そのように

最大 1 レベルのサブメニューを取得するクエリを作成しようとしました

select 
    m.ItemName, STUFF((select ',' + s.ItemName 
                       from MenuItems s
                       where s.ParentId = m.MenuItemsID FOR XML PATH('')), 1, 1, '') as SubMenus
from MenuItems m 
where ParentId = 0

しかし、私は m レベルのサブメニューが欲しい

そのクエリをどのように書くことができますか?誰でも私を助けてもらえますか?

4

2 に答える 2

2

これを実現するには、再帰的な CTE (Common Table Expression) が必要です。次のようなことを試してください:

;WITH Submenus AS
(
    SELECT 
        MenuItemID, ItemsName, ParentID, Level = 0
    FROM
        dbo.menuitem m
    WHERE
        m.ParentID = 0

    UNION ALL

    SELECT 
        m2.MenuItemID, m2.ItemsName, m2.ParentID, s.Level + 1 
    FROM
        dbo.menuitem m2
    INNER JOIN
        Submenus s ON m2.ParentID = s.MenuItemID  
)  
SELECT
    *
FROM    
    Submenus
ORDER BY
    Level, MenuItemID

これにより、次の出力が得られます。

MenuItemID  ItemsName  ParentID  Level
   1        Home           0       0
   2        Product        0       0
   3        Categories     0       0
   4        Brand          0       0
   5        H1             1       1
   6        H2             1       1
   7        P1             2       1
   8        C1             3       1
   9        H1Sub1         5       2
  10        P1Sub1         7       2
于 2012-10-05T11:02:10.393 に答える
0

再帰的な CTE を使用できます。

;WITH cte_menu(Level, MenuItemsId, MenuType, ItemsName, ParentID, URL, Images)
AS
(
SELECT 0 AS Level, MenuItemsId, MenuType, ItemsName, ParentID, URL, Images
FROM MenuItem 
WHERE ParentID = 0

UNION ALL

SELECT Level + 1, t.MenuItemsId, t.MenuType, t.ItemsName, t.ParentID, t.URL, t.Images
FROM MenuItem  t
INNER JOIN cte_menu c ON c.MenuItemsId = t.ParentID
)
SELECT *
FROM cte_menu
ORDER BY Level, MenuItemsId

CTE を使用した再帰クエリの詳細

于 2012-10-05T11:01:05.247 に答える