2015-09-22 82 views
3

DEMO SQL FIDDLE如何订购此查询?

我喜欢在上面演示了查询,但我不知道如何订购此查询,我希望得到的结果是这样的:

Name 
----- 
Menu_1 
------- 
..... Sub_Menu_1 
------- 
Menu_2 
------- 
..... Sub_Menu_2 
------- 
..........Sub_Sub_Menu_2 
------- 
Menu_3 
------- 

我该怎么办这个?感谢

编辑(从SQLFiddle演示资讯)

表:

CREATE TABLE Menus 
    (
    IdMenu int primary key, 
    IdParentMenu varchar(20), 
    Name varchar(30) 
    ); 

数据:

INSERT INTO Menus 
(IdMenu, IdParentMenu, Name) 
VALUES 
('1', '0', 'Menu_1'), 
('2', '0', 'Menu_2'), 
('3', '0', 'Menu_3'), 
('4', '1', 'SubMenu_1'), 
('5', '2', 'SubMenu_2'), 
('6', '5', 'Sub-SubMenu_2'); 

我的查询:

WITH MenuCTE (IdMenu, IdParentMenu, ParentMenu, Name, Lvl) 
AS 
(
    -- Anchor member 
    SELECT m.IdMenu, m.IdParentMenu, CAST('' AS varchar) AS ParentMenu, m.Name, 0 AS Lvl 
    FROM dbo.Menus AS m 
    WHERE CAST(m.IdParentMenu AS INT) = 0 
    UNION ALL 

    -- Recursive member 
    SELECT m.IdMenu, m.IdParentMenu, CAST(mc.Name AS varchar) AS ParentMenu, m.Name, Lvl + 1 AS Lvl 
    FROM dbo.Menus AS m 
    INNER JOIN MenuCTE AS mc 
     ON CAST(m.IdParentMenu AS INT) = mc.IdMenu 
) 
SELECT IdMenu, IdParentMenu, ParentMenu, REPLICATE('....', Lvl) + Name 
FROM MenuCTE 
--WHERE Lvl > 0 
ORDER BY IdParentMenu 
GO 
+0

下一次请包括演示(或任何外部链接)的(相关)信息,这可以让进一步的读者了解远程数据不可用时的问题或答案。 – Pred

回答

3

添加,通过本场计算路径和秩序领域:

WITH MenuCTE (IdMenu, IdParentMenu, ParentMenu, Path, Name, Lvl) 
AS 
(
    -- Anchor member 
    SELECT m.IdMenu, m.IdParentMenu, 
      CAST('' AS varchar) AS ParentMenu, 
      CAST(m.Name AS varchar) AS Path, 
      m.Name AS Name, 
      0 AS Lvl 
    FROM dbo.Menus AS m 
    WHERE CAST(m.IdParentMenu AS INT) = 0 
    UNION ALL 

    -- Recursive member 
    SELECT m.IdMenu, m.IdParentMenu, 
      CAST(mc.Name AS varchar) AS ParentMenu, 
      CAST(mc.Path + '.'+ m.Name AS varchar) AS Path, 
      m.Name, 
      Lvl + 1 AS Lvl 
    FROM dbo.Menus AS m 
    INNER JOIN MenuCTE AS mc 
     ON CAST(m.IdParentMenu AS INT) = mc.IdMenu 
) 
SELECT IdMenu, IdParentMenu, ParentMenu, 
     REPLICATE('....', Lvl) + Name, Path 
FROM MenuCTE 
ORDER BY Path 

注:在上面的查询Path使用Name场而建,因此订货菜单,子菜单等是根据他们的名字进行的。 Path值是这样的:

Menu_1 
Menu_1.SubMenu_1 
Menu_2 
Menu_2.SubMenu_2 
Menu_2.SubMenu_2.Sub-SubMenu_2 

如果您想通过IDS订购,然后代替Name使用IdMenu只是内置Path。在这种情况下Path值将是这样的:

1 
1.4 
2 
2.5 
2.5.6 

Demo here

+0

非常感谢您的回答,这对我非常有帮助; -D –

1

这应该是不错的。

WITH MenuCTE (IdMenu, IdParentMenu, ParentMenu, Ord, Name, Lvl) 
AS 
(
    -- Anchor member 
    SELECT m.IdMenu, m.IdParentMenu, CAST('' AS varchar) AS ParentMenu, CAST(m.IdMenu AS varchar) as Ord, m.Name, 0 AS Lvl 
    FROM dbo.Menus AS m 
    WHERE CAST(m.IdParentMenu AS INT) = 0 
    UNION ALL 

    -- Recursive member 
    SELECT m.IdMenu, m.IdParentMenu, CAST(mc.Name AS varchar) AS ParentMenu, cast((mc.Ord + CAST(m.IdMenu AS varchar)) as varchar) as Ord, m.Name, Lvl + 1 AS Lvl 
    FROM dbo.Menus AS m 
    INNER JOIN MenuCTE AS mc 
     ON CAST(m.IdParentMenu AS INT) = mc.IdMenu 
) 
SELECT ord, IdMenu, IdParentMenu, ParentMenu, REPLICATE('....', Lvl) + Name 
FROM MenuCTE 
--WHERE Lvl > 0 
ORDER BY ord 
GO