2012-05-15 4 views
1

어떻게 CTE 쿼리를 사용하여 계층 테이블을 정렬 할 수 있습니까?계층 테이블 CTE 쿼리 정렬

샘플 테이블 :

|ID|Name |ParentID| 
| 0|  |-1  | 
| 1|1  |0  | 
| 2|2  |0  | 
| 3|1-1 |1  | 
| 4|1-2 |1  | 
| 5|2-1 |2  | 
| 6|2-2 |2  | 
| 7|2-1-1 |5  | 

내 마음에 드는 결과는 다음과

다른 샘플
|ID|Name |ParentID|Level 
| 0|  |-1  |0 
| 1|1  |0  |1 
| 3|1-1 |1  |2 
| 4|1-2 |1  |2 
| 2|2  |0  |1 
| 5|2-1 |2  |2 
| 7|2-1-1 |5  |3 
| 6|2-2 |2  |2 

:

타 샘플 :

|ID|Name  |ParentID| 
| 0|   |-1  | 
| 1|Book  |0  | 
| 2|App  |0  | 
| 3|C#  |1  | 
| 4|VB.NET |1  | 
| 5|Office |2  | 
| 6|PhotoShop |2  | 
| 7|Word  |5  | 

내 마음에 드는 결과는 :

|ID|Name  |ParentID|Level 
| 0|   |-1  |0 
| 1|Book  |0  |1 
| 3|C#  |1  |2 
| 4|VB.NET |1  |2 
| 2|App  |0  |1 
| 5|Office |2  |2 
| 7|Word  |5  |3 
| 6|PhotoShop |2  |2 
+0

은 무엇인가 : 당신이에게 ParentID 열을 대체하지 할 수있는 경우에, 당신은 즉시 그것을 변환 할 수 있습니다 이 규칙? 이것은 이름으로 정렬되지만 레벨로 정렬되지는 않습니다. –

+0

어떤 버전의 SQL Server입니까? –

+0

Sql Server 2008 – Mehdi

답변

3

hierarchyid 여기

WITH CTE 
AS(
    SELECT parent.*, 0 AS Level 
    FROM @table parent 
    WHERE parent.ID = 0 

    UNION ALL 

    SELECT parent.*, Level+1 
    FROM @table parent 
    INNER JOIN CTE prev ON parent.ParentID = prev.ID 
) 

SELECT * FROM CTE 
ORDER BY Name 

는 샘플 데이터 (그것을 다음에 자신을 추가)입니다 데이터 유형은 계층 적 데이터를 나타낼 수 있고 이미 원하는 정렬 순서를 가지고 있습니다.

는 (실제 대답은 아주 작은 데이터 설정되어이 스크립트의 대부분입니다)

declare @t table (ID int not null,Name varchar(10) not null,ParentID int not null) 
insert into @t(ID,Name,ParentID) 
select 0,''   ,-1 union all 
select 1,'Book'  ,0 union all 
select 2,'App'  ,0 union all 
select 3,'C#'  ,1 union all 
select 4,'VB.NET' ,1 union all 
select 5,'Office' ,2 union all 
select 6,'PhotoShop' ,2 union all 
select 7,'Word'  ,5 

;With Sensible as (
    select ID,Name,NULLIF(ParentID,-1) as ParentID 
    from @t 
), Paths as (
    select ID,CONVERT(hierarchyid,'/' + CONVERT(varchar(10),ID) + '/') as Pth 
    from Sensible where ParentID is null 
    union all 
    select s.ID,CONVERT(hierarchyid,p.Pth.ToString() + CONVERT(varchar(10),s.ID) + '/') 
    from Sensible s inner join Paths p on s.ParentID = p.ID 
) 
select 
    * 
from 
    Sensible s 
     inner join 
    Paths p 
     on 
      s.ID = p.ID 
order by p.Pth 
0

ORDER BY Name 원하는대로 작동합니다 :

declare @table table(ID int,Name varchar(10),ParentID int); 
insert into @table values(0,'',-1); 
insert into @table values(1,'1',0); 
insert into @table values(2,'2',0); 
insert into @table values(3,'1-1',1); 
insert into @table values(4,'1-2',1); 
insert into @table values(5,'2-1',2); 
insert into @table values(6,'2-2',2); 
insert into @table values(7,'2-1-1',5); 

결과 :

ID Name ParentID Level 
0    -1   0 
1 1   0   1 
3 1-1  1   2 
4 1-2  1   2 
2 2   0   1 
5 2-1  2   2 
7 2-1-1  5   3 
6 2-2  2   2 
+0

이 테이블은 샘플 이고 "이름"필드는 모든 문자 – Mehdi

+1

@Mehdi 일 수 있습니다. 그런 다음 더 나은 샘플을 제공하십시오. 실제로 규칙이 무엇인지는 분명하지 않습니다. 어떻게 주문 하시겠습니까? –