2009-08-26 3 views
2

나는 엔티티의 기본 트리 구조를 가지고있다. 트리는 최대 5 개의 노드 깊이 일 수 있지만 N 노드 너비 일 수 있습니다. 내가 시작 "MYID을"데 번역 할 수있는 알려진 객체로 밖으로 시작하고계층적인 SQL 질문

myID | myDescription | myParentID 

: 다음과 같다 내가 유사한 테이블이 관계를 매핑했다. 이제 모든 자식 노드를 얻고 싶습니다. 하나의 문장에서 모든 자식 노드를 얻는 방법이 있습니까? 이것은 나의 아이들의 아이들을 포함하고, 나무의 아래에 계속 될 필요가있다. Oracle SQL을 사용하고 있습니다.

감사합니다, 제이

답변

4
SELECT * 
FROM mytable 
START WITH 
     myid = :id 
CONNECT BY 
     myparentid = PRIOR myid 
+0

이것은 오라클에서만 유효합니다. 맞습니까? –

+0

@Eric : 올바른, CONNECT BY Oracle 유일한 계층 적 쿼리 구문입니다. –

+0

'@Eric J.' : 절대적으로. 'SQL 서버'와'PostgreSQL 8.4'에서'CTE'를 사용하고,'PostgreSQL 8.3-'과'MySQL'은 내 블로그에서이 기사를 읽었습니다 : http://explainextended.com/2009/05/29/hierarchical -queries-in-postgresql /, http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/ – Quassnoi

0

난 당신이 하나의 쿼리에서 모든 노드를 검색 할 경우 계층 구조를 모델링하기 위해 다른 방법을 사용하는 것이 좋습니다 것입니다. 아주 좋은 하나의 일반적인 구현은 nested set 모델입니다. 이 기사에서는 MySQL에서이 기능이 어떻게 구현되는지에 대해 간략히 설명하지만 오라클에 쉽게 포팅 될 수 있습니다.

+0

멋진 모델이지만 동시 업데이트는 권장하지 않습니다. 많은 양의 데이터. 리프를 추가하면 테이블의 모든 레코드를 업데이트 할 수 있습니다. ** 데이터가 거의 바뀌지 않는 경우 좋은 조언. ** – Christian13467

0

구현할 수있는 깔끔한 방법은 "경로"가 포함 된 다른 필드를 레코드에 추가하는 것입니다. 최고 기록이 ID = 1이라고합시다. ID가 5 인 자식이 있고 ID가 20 인 자식이 있고 마지막 레코드는 경로가 /1/5/20이됩니다 그러면 상위 노드의 모든 자식 노드를 원하는 경우

중간 노드

select * from MyTable where Path like '/1/5/%' 

깔끔한 것은 약의 자녀를 얻으려면 -

select * from MyTable where Path like '/1/%' 

는 (그러나 개념은 여전히 ​​적용됩니다 죄송합니다, SQL 서버 구문, 나는 오라클 개발자 아니에요) 그 해결책은 "경로"필드에 색인을 적용 할 수 있다는 것입니다. 명령문은 단일 색인 스캔을 사용하여 실행되므로 매우 효율적입니다.