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 は、サブメニューが、id が submenu1 として保存されている特定のメニューに属していることです。
  3. MainMenu は、それがメニューなのかサブメニューなのかが少しわかりません。
  4. メニューの種類はそれです
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

このようにグループ化する方法は?このようにグループ化した後でのみ、このクエリの結果をメニューとそのサブメニューを示すツリー構造として作成できます。

4

1 に答える 1

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

于 2013-01-25T12:45:46.337 に答える