본문 바로가기

프로그래밍/Etc.

Menu 쿼리 만들기.

안녕하세요.


메뉴 쿼리에 대해서 살펴 보기로 하겠습니다. 


아래 구문은 MS-SQL 구문입니다. 



WITH menu(Depth, PageID, PageTitle, ParentID, PageURL, PageDescription)

                                  AS

                                  (

                                  SELECT 0 AS Depth, PageID, PageTitle, ParentID, PageURL, PageDescription

                                  FROM MenuList

                                  WHERE ParentID = 0 


                                  UNION ALL  


                                  SELECT Depth + 1, t.PageID, t.PageTitle, t.ParentID, t.PageURL, t.PageDescription

                                  FROM MenuList

                                  INNER JOIN menu c ON c.PageID = t.ParentID 

                                  )

                                  SELECT  convert(varchar, Depth) as Depth 

                               , PageID 

                               , PageTitle

                               , ParentID 

                               , PageURL

                               , PageDescription

                                  FROM menu

                                  ORDER BY Depth, PageID



1. 괄호 안의 구문을 먼저 살펴 보겠습니다. 


 SELECT 0 AS Depth, PageID, PageTitle, ParentID, PageURL, PageDescription

                                  FROM MenuList

                                  WHERE ParentID = 0 


메뉴 최상단을 가져오는 구문이죠.. 메뉴 테이블은 보통 PageID 와 ParentID 로 구성되어 있는데 ParentID 가 없는 메뉴는 최상단에 위치하게 됩니다. 


이블로그의 Web 카테고리는 최상단 카테고리로 볼수 있습니다. 



Union ALL  


두개의 쿼리문을 하나로 합치는 구문이죠. 부모 밑에 자식 카테고리가 올수 있도록 넣어줍니다. 


SELECT Depth + 1, t.PageID, t.PageTitle, t.ParentID, t.PageURL, t.PageDescription

                                  FROM MenuList

                                  INNER JOIN menu c ON c.PageID = t.ParentID 


해당 구문을 싸고 있는 Menu와 비교하면서 부모를 찾습니다. 


빈값이 아니라면 해당 쿼리를 재귀적으로 호출합니다. 



SELECT  convert(varchar, Depth) as Depth 

                                , PageID 

                                , PageTitle

                                , ParentID 

                                , PageURL

                                , PageDescription

                             FROM menu

                                  ORDER BY Depth, PageID


마지막으로 나타내고 싶은 순서대로 정렬을 합니다. 




메모해 두면 언제든지 요긴하게 쓰일 메뉴 쿼리 입니다 .


감사합니다.