2011-09-04 4 views
0

이 경로는 materialized path 열 (matpath)이있는 트리 구조 테이블입니다. 데이터는 다음과 같습니다ID가 구체화 된 경로에있는 모든 행을 선택하십시오.

ID MATPATH PARENT 
--------------------- 
1  NULL  NULL 
2  1.   1 
3  1.2.  2 
4  1.2.3.  3 
5  1.2.  2 
6  1.2.3.4. 4 
7  1.2.5.  5 

ID를 감안할 때

, 나는 위의 (하나 개의 쿼리) 이하 (밥 쿼리) 모든 요소를 ​​얻을 수있는 방법? 예를 들어, ID가 7 인 경우 7 이외에 ID가 1, 2 및 5 인 행을 선택하려고합니다. 주어진 ID가 3이면 1, 2 및 3을 선택하십시오.

감사합니다.

답변

1

먼저, .을 구체화 된 경로에 넣을 지 결정해야합니다. 을 사용하면 더 쉽게 사용할 수 있다고 가정합니다. 이 같은

뭔가 노드 아래에 당신을 얻을 것이다. X 당신이 관심있는 노드가

select id 
from tree 
where matpath like (
    select matpath || id || '.%' 
    from tree 
    where id = X 
) 

귀하의 나무는 다음과 같습니다

1 --- 2 -+- 3 --- 4 --- 6 
     | 
     +- 5 --- 7 

그리고 위의 쿼리를 적용 다이어그램과 일치하는 값은 다음과 같습니다.

X | output 
--+-------------- 
3 | 4, 6 
7 | 
2 | 3, 4, 5, 6, 7 

노드 가져 오기 ab 주어진 노드를 클라이언트에서보다 쉽게 ​​만들려면 : matpath을 잡고, .의 후미를 잘라낸 다음 .에 남아있는 것을 나눕니다. SQLite의 문자열 처리 지원은 제한적입니다. 사용자 정의 split 함수를 추가하지 않고 구체화 된 경로를 분할하는 방법을 생각할 수 없습니다. 적절한 split을 추가 할 수 있는지는 확실하지 않습니다.

그래서 데이터베이스 외부에서 두 개의 쿼리와 약간의 문자열로 당신이 원하는 것을 얻을 수 있습니다.

+0

좋아, 내가보고 싶지 않은 'one-query-solve-all' 해결책이 있기를 바랐다. 고맙습니다. – Francisc

관련 문제