2014-04-21 1 views
1

상위 및 하위 노드를 포함하는 동일한 테이블을 사용하여 동적 메뉴를로드하려고합니다. 테이블 구조 :SQL 재귀 샘플

COMPID | ParentID | MenuName 
---------------------------- 
1  | 1  | Menu 1 
2  | 2  | Menu 2 
3  | 1  | Menu 3 of Child 1 
4  | 1  | Menu 4 of Child 1 
5  | 4  | Menu 5 of Child 4 of Child 1 

기술 한 후 더있을 수있다. 하지만 동적으로로드하려면 recursion을 사용하는 것이 가능한지 알아야합니까? 예인 경우 예를 들어 보겠습니다.

+0

당신이 구체화 된 u 리 테이블에 대해 말을하는거야? – arunmoezhi

답변

2

ANSI SQL은 공통 테이블 식을 사용하는 재귀 쿼리를 지원합니다.

다음은 ANSI의 SQL을 사용하여 각 메뉴 항목의 전체 경로를 검색합니다

with recursive menu_tree as (
    select compid, parentid, menuname, menuname as menu_path 
    from menus 
    where compid = parentid -- the root nodes 
    union all 
    select c.compid, c.parentid, c.menuname, p.menu_path||'/'||c.menuname 
    from menus c 
    join menu_tree p 
    on c.parentid = p.compid 
    and c.parentid <> c.compid 
) 
select compid, menu_path 
from menu_tree; 

SQLFiddle 예 : http://sqlfiddle.com/#!15/fbfba/1

+0

표준 SQL이지만 모든 공급 업체가 표준 SQL을 구현하지는 않습니다. 주목할 만하게 MySQL과 SQLite (및 아마 다른 사람). –

+0

@ Clockwork-Muse : SQLite *는 이것을 지원합니까 : http://sqlite.org/lang_with.html "big names"중에서 이것은 (그리고 다른 많은 최신 SQL 기능을 지원하지 않는) MySQL 일뿐입니다 –

+0

허, 너 맞아. 대신 내가 생각했던 것이 무엇인지 궁금하네요. 어쩌면'ROW_NUMBER()'? –