2009-11-19 5 views
1

나는 범주의 계층 구조를 나타 내기 위해 사용하는 간단한 테이블을 가지고 있습니다.SQL 재귀 메뉴 정렬

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를 제거 :

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 

내가 전에 완벽하게 작동하지만 DB를 백업하는 것을 잊어 버렸고 서버 업그레이드에서 잃어 버렸습니다.

2008 년에 HierarchyID 유형을 살펴 봤지만 동일한 수준의 어린이 주문에 관심이 있다면 엉덩이에 큰 고통이 될 것 같습니다.

+0

당신은 무엇을 정렬하려고하는지 설명해 주시겠습니까? –

답변

5

좋아, 잡았어 :) - 여기가 효과가있는 것 같습니다.

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] 
+0

굉장! 어떤 이유로 나는 테이블에 경로를 저장하는 것을 생각했지만 쿼리에서 생성하는 것을 잊어 버렸습니다. – AndyMcKenna