【问题标题】:SQL Recursive Menu SortingSQL递归菜单排序
【发布时间】:2009-11-19 03:24:57
【问题描述】:

我有一个简单的表,我用它来表示类别的层次结构。

CREATE TABLE [dbo].[Categories](
    [ID] [int] IDENTITY(1,1) NOT NULL,
[Title] [varchar](256) NOT NULL,
[ParentID] [int] NOT NULL,
CONSTRAINT [PK_Categories] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

INSERT INTO [MDS].[dbo].[Categories]([Title],[ParentID]) VALUES ('All', 0)
INSERT INTO [MDS].[dbo].[Categories]([Title],[ParentID]) VALUES ('Banking', 8)
INSERT INTO [MDS].[dbo].[Categories]([Title],[ParentID]) VALUES ('USAA Checking', 2)
INSERT INTO [MDS].[dbo].[Categories]([Title],[ParentID]) VALUES ('USAA Mastercard', 2)
INSERT INTO [MDS].[dbo].[Categories]([Title],[ParentID]) VALUES ('Medical', 8)
INSERT INTO [MDS].[dbo].[Categories]([Title],[ParentID]) VALUES ('Jobs', 8)
INSERT INTO [MDS].[dbo].[Categories]([Title],[ParentID]) VALUES ('Archive', 1)
INSERT INTO [MDS].[dbo].[Categories]([Title],[ParentID]) VALUES ('Active', 1)
INSERT INTO [MDS].[dbo].[Categories]([Title],[ParentID]) VALUES ('BoA Amex', 2)

一切都很好,除了选择整棵树。这是我的查询,我删除了我的 ORDER BY,因为它不起作用:

WITH CategoryTree (ID, Title, Level, ParentID) AS
(
   SELECT  r.ID, r.Title, 0 Level, r.ParentID
   FROM Categories r
   WHERE r.ParentID = 0

   UNION ALL

   SELECT c.ID, c.Title, p.Level + 1 AS Level, c.ParentID
   FROM Categories c
   INNER JOIN CategoryTree p
      ON p.ID = c.ParentID
)

SELECT  ID,
    REPLICATE('-----', Level) + Title AS Title,
    ParentID
FROM CategoryTree

结果:

ID  Title                        ParentID
1   All                              0
7   -----Archive                     1
8   -----Active                      1
2   ----------Banking                8
5   ----------Medical                8
6   ----------Jobs                   8
3   ---------------USAA Checking     2
4   ---------------USAA Mastercard   2
9   ---------------BoA Amex          2

我想要的结果是这样的:

ID  Title                            ParentID
1   All                               0
8   -----Active                      1
2   ----------Banking                8
9   ---------------BoA Amex          2
3   ---------------USAA Checking     2
4   ---------------USAA Mastercard   2
6   ----------Jobs                   8
5   ----------Medical                8
7   -----Archive                     1

让我感到沮丧的是,我之前可以完美地运行它,但后来我忘记备份数据库并在服务器升级中丢失了它。

我在 2008 年查看了 HierarchyID 类型,但如果您关心同一级别的子级顺序,这似乎是一件很痛苦的事情。

【问题讨论】:

  • 您能解释一下您要按什么排序吗?

标签: sql-server-2005 sql-server-2008


【解决方案1】:

好的,明白了 :) -- 这似乎在这里工作。

DECLARE @Categories TABLE (
 ID int PRIMARY KEY
,Title varchar(256)
,ParentID int
)

INSERT INTO @Categories
VALUES
 (1, 'All', 0)
,(2,'Banking', 8)
,(3,'USAA Checking', 2)
,(4,'USAA Mastercard', 2)
,(5,'Medical', 8)
,(6,'Jobs', 8)
,(7,'Archive', 1)
,(8,'Active', 1)
,(9,'BoA Amex', 2)


;
WITH  CategoryTree
        AS (SELECT  r.ID, r.Title, 0 Level, r.ParentID,
                    CAST(r.Title AS VARCHAR(1000)) AS "Path"
            FROM    @Categories r
            WHERE   r.ParentID = 0
            UNION ALL
            SELECT  c.ID, c.Title, p.Level + 1 AS Level, c.ParentID,
                    CAST((p.path + '/' + c.Title) AS VARCHAR(1000)) AS "Path"
            FROM    @Categories c
                    INNER JOIN CategoryTree p
                      ON p.ID = c.ParentID
           )
  SELECT  ID, REPLICATE('-----', Level) + Title AS Title, [Path]
  FROM    CategoryTree
  ORDER BY [Path]

【讨论】:

  • 太棒了!出于某种原因,我曾想过将路径存储在表中,但忘记在查询中生成它。
猜你喜欢
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2010-10-08
  • 2014-08-12
  • 2017-01-14
相关资源
最近更新 更多