본문 바로가기

DB

[코드처리] ROW_NUMBER( ) OVER(ORDER BY)

Tree 구조를 게시판에 표시 해야 해서

 

WITH Tree_Query (a,b,c,Level) AS
(
    SELECT
    a
    ,b
    ,c
    ,1
     
    FROM 테이블 AS [A]
    WHERE 부모ID IS NULL--연결된 상위 데이터 ID
    UNION ALL
    SELECT
     a
    ,b
    ,c
    ,C.Level + 1
                                    
    FROM 테이블 AS [A]
    INNER JOIN Tree_Query AS [C] ON A.부모ID = C.ID        

)

코드를 짜두고는

부모데이터(Root Node)는 최신순으로,
하위데이터들은 최신순 반대로 Sorting해서 데이터를 표시하고 싶은데 방법이 없어서

 

ROW_NUMBER() OVER(ORDER BY) 처리로 Sorting할 기준 컬럼을 만들었다.

 

Partition개념을 추가해서 쓰는 쿼리가 많던대 이미 Union으로 하위 데이터들(Part)을 나누어 두었으므로 Parition까지는 필요 없다.

 

 

 

WITH Tree_Query (a,b,c,Level,Sort) AS
(
    SELECT
    a
    ,b
    ,c
    ,1
    [Sort] = CONVERT(NVARCHAR(1000),ROW_NUMBER( )  OVER(ORDER BY  [A].AID DESC) + 100000000 ) 

    FROM 테이블 AS [A]
    WHERE 부모ID IS NULL--연결된 상위 데이터 ID
    UNION ALL
    SELECT
     a
    ,b
    ,c
    ,C.Level + 1
    ,[Sort] = CONVERT(NVARCHAR(1000), C.[Sort]  +  '.' +  CONVERT(NVARCHAR(1000),ROW_NUMBER( )  OVER(ORDER BY [A].AID ASC)))                                 
    FROM 테이블 AS [A]
    INNER JOIN Tree_Query AS [C] ON A.부모ID = C.ID        

)

부모 데이터 Sort 컬럼에 + 100000000이 되어 있는 이유는

AID가 자동 증가 1,2,3,4 순인데

 

저렇게 Tree 하고 Select OrderBy 절에 Sort 컬럼을 ASC로 주면

1 다음에 2가 아니라 10, 11, 12 가 나온다.(문자열 비교라서..)

 

문자열로 최대 1000000000이상의 데이터는 없을거라 판단되어서 저렇게 처리.