2013-01-25 20 views
0
Id | MenuName  | vc_Link | SubMenu1 | IsMainMenu | TypeOfMenu 
----------------------------------------------------------------------- 
1 | Home   | NULL | NULL |  1  |  0 
2 | Projects  | NULL | NULL |  1  |  0 
4 | Pr1   | NULL | 2  |  0  |  1 
5 | Homesub  | NULL | 1  |  0  |  1 
6 | Pr1Sub1  | NULL | 4  |  0  |  2 

以上是我的表結構。無法對錶中的數據進行分組

  1. MENUNAME是菜單的名稱和子菜單
  2. SubMenu1是子菜單屬於paticular菜單衛生組織ID保存爲submenu1
  3. 的MainMenu有點知道它是否是一個菜單或子菜單。
  4. typeofmenu是
0 means main menu 
1 means submenu 
2 means submenu's submenu 

現在我的問題是,我想它顯示如下

1 Home 
     5 HomeSub 
    2 Projects 
    4 Pr1 
     6 Pr1Sub1 

    Id | MenuName  | vc_Link | SubMenu1 | IsMainMenu | TypeOfMenu 
    ----------------------------------------------------------------------- 
    1 | Home   | NULL | NULL |  1  |  0 
    5 | HomeSub  | NULL | 1  |  0  |  1 
    2 | Projects  | NULL | NULL |  1  |  0 
    4 | Pr1   | NULL | 2  |  0  |  1 
    6 | Pr1Sub1  | NULL | 4  |  0  |  2 

如何分組這個樣子? 只有像這樣分組後,我才能將此查詢的結果作爲顯示菜單及其子菜單的樹結構。

+0

這是SQL Server 2008 R2的.. – user1996062

回答

2

事情是這樣的:

with menu_tree (id, menuname, level, sort_path) as (
    select id, 
      cast(menuname as varchar(max)), 
      1 as level, 
      cast(id as varchar(max)) as sort_path 
    from menus 
    where submenu1 is null 
    union all 
    select m.id, 
      cast(replicate('_', p.level * 2) + m.menuname as varchar(max)) as menuname, 
      p.level + 1, 
      p.sort_path + '_' + cast(m.id as varchar(max)) 
    from menus m 
    join menu_tree p on p.id = m.submenu1 
) 
select id, menuname 
from menu_tree 
order by sort_path; 

SQLFiddle:http://sqlfiddle.com/#!3/6c4ba/1

+0

我使用SQL Server 2008 R2 ......你能告訴我怎麼這個ANSI查詢轉換到sql server 2008查詢 – user1996062

+0

錯誤:類型在遞歸查詢「menu_tree」的列「menuname」的錨點和遞歸部分之間不匹配。 – user1996062

+0

我改變一點點,因爲CONCAT不與SQL與menu_tree爲( 選擇ID,菜單名稱,工作了1爲其中submenu1爲空 UNION ALL 選擇m.id從菜單 水平,複製(」」,P .level * 2)+ m.menuname menuname,p.level + 1 from menu m join menu_tree p on p.id = m.submenu1 ) select_menu,menuname from menu_tree; – user1996062

相關問題