2011-07-05 2 views
6

저는 Firebird 2.1을 사용하고 있습니다. 테이블 이름 Folders는 필드,있다 :SQL을 사용하여 데이터베이스에서 중첩 관계가있는 부모를 어떻게 찾을 수 있습니까?

  • 이 ParentFolderID
  • 을 FolderID
  • FolderName은

ParentFolderID은 -1이 루트 폴더 인 경우 - 그렇지 않으면 상위 폴더의 ID가 포함 .

하위 수준 노드의 모든 부모 (루트 폴더까지)를 찾으려면 어떻게해야합니까?

재귀 쿼리가 필요합니까? (Firebird supports them)이 같은

+1

이인제 북동 파를 싶어서의 프랑스어) –

+0

@OMG의 조랑말 : 영어 사이트를보십시오 : http://pabloj.blogspot.com/2008/01/new-challenges-new-synthax.html –

+2

@ypercube : 당신이 작성한 질문 : p –

답변

7

뭔가 :

WITH RECURSIVE hierarchy (folderid, ParentFolderId, FolderName) as (
    SELECT folderid, ParentFolderId, FolderName 
    FROM folders 
    WHERE ParentFolderID = -1 

    UNION ALL 

    SELECT folderid, ParentFolderId, FolderName 
    FROM folders f 
    JOIN hierarchy p ON p.folderID = f.parentFolderID 
) 
SELECT * 
FROM hierarchy 

편집 : 특정 폴더의 모든 부모를 찾는 계층 구조 "가"를 안내합니다 다음 쿼리.

WITH RECURSIVE hierarchy (folderid, ParentFolderId, FolderName) as (
    SELECT folderid, ParentFolderId, FolderName 
    FROM folders 
    WHERE folderid = 42 

    UNION ALL 

    SELECT folderid, ParentFolderId, FolderName 
    FROM folders f 
    JOIN hierarchy p ON p.parentFolderID = f.folderID 
) 
SELECT * 
FROM hierarchy 
+0

내가 게시 한 쿼리가 부모 노드의 모든 하위 노드를 반환한다고 생각합니다. 하위 노드의 모든 부모를 찾는 쿼리가 있습니까? 감사. – Steve

+0

시작 조건과 "트래버스"조건을 "되돌리기"만하면됩니다. 내 편집보기 –

+0

고맙습니다! 한 가지 더 도움주세요 : List 명령을 사용하여 폴더 이름을 문자열 (Child 2/Child 1/Parent)에 넣을 수 있습니다. 어떻게하면 쿼리의 결과가 다음과 같이 바뀔 수 있습니까? Parent/Child 1/Child 2? – Steve

관련 문제