2011-08-20 2 views
0

그룹의 트리/계층 구조 및 각 그룹과 연결된 SQL 테이블 항목 (예 : 각 항목이 그룹에 속함)이 있습니다. 주어진 그룹 또는 아래의 그룹과 연관된 행만 선택해야합니다.계층 적 권한을 기반으로 행 선택

예 : 이 그룹 트리라고 : 그룹 C에 대한 선택하면 C, E와 F (C의 후손)에 속하는 항목을 선택합니다 동안 A 군에 대한

A 
=> B 
    => D 
=> C 
    => E 
    => F 

선택 항목은 모든 행을 반환합니다.

SELECT * FROM table WERE Group in ('C','E','F') 

프로그래밍 방식으로 후손의 목록을 결정하는

를 조회하기 전에 목록에서

1 : 지금까지

는, 나는 두 가지 방법 중 하나를 구현할 수 있습니다 생각하고 2. 연산자 BITWISE

SELECT * FROM table WHERE GroupBitMask & 52!=0 

(즉, C '+'E '+'F '== 비트 3 + 비트 5 + 비트 6 == 110100 == 52)

다시이 그룹 트리를 구문 분석하여 쿼리를 계산해야합니다 . 아마 64 개의 그룹을 제한 할 수 있다고 생각합니다. 이를 위해 64 비트 마스크를 사용하십시오.

데이터베이스에서 색인을 사용할지 또는 모든 행을 검색하여 비트 결과를 결정하는지 확실하지 않습니다.

필요한 행을 선택할 수있는 다른 방법이 있습니까?

select Path from YourTable where Group = 'C' 

이 그럼 당신은 같은 모든 자손을 조회 할 수 있습니다

Group  Path Other columns 
A   A  ... 
B   AB  ... 
C   AC  ... 
D   ABD  ... 
E   ACE  ... 
F   ACF  ... 

당신은 단일 쿼리와 기본 경로를 검색 할 수 있습니다

답변

1

간단한 해결책은 행의 일환으로 조상을 저장하는 것입니다 :

select * from YourTable where path like 'AC%' 

의 기본 키로 매우 잘 수행됩니다.3210이고 인덱스는 (Path)입니다.