2012-05-04 3 views
0

나는 연결 쿼리를 사용하여 그룹에 계층 적 그룹을 표시합니다.이 페이지에는 부모 그룹을 선택하기위한 콤보 상자가 있습니다. 하지만 현재 편집중인 그룹을 포함하는 모든 행을 숨기려고합니다. 경로에서 검색하여 SYS_CONNECT_BY_PATH에 의해 연결하여 이전 쿼리로 연결

내 테이블입니다

GROUPS 
------------- 
GROUP_ID, GROUP_NAME, GROUP_TYPE, PARENT_ID 

나의 첫 질문이었다;

SELECT * FROM 
(SELECT 
    GROUP_ID, 
    LPAD('-',LEVEL,'-')|| GROUP_NAME GROUP_NAME, 
    SYS_CONNECT_BY_PATH(GROUP_NAME, '->') GROUP_NAME_PATH 
FROM GROUPS 
    START WITH PARENT_ID IS NULL AND TYPE='G' 
    CONNECT BY PRIOR GROUP_ID=PARENT_ID) 

이 결과는 그리드에 있습니다.

27 -Generel Manager ->Generel Manager, 
28 --Project Manager ->Generel Manager->Project Manager, 
24 ---System Administrator ->Generel Manager->Project Manager->System Administrator 
25 ---Software Developer ->Generel Manager->Project Manager->Software Developer 
26 ----Intern   ->Generel Manager->Project Manager->Software Developer->Intern 

예 : 페이지 Editgroup.aspx?group_id=24

이 theese 모든 행을 보여 주지만, 나는 그룹이 selfchild 할 수 없기 때문에 GROUP_ID = 24 을 포함하는 모든 행 경로를 숨기려고합니다.

이 쿼리로 임시 해결책을 찾았습니다.

SELECT * FROM 
(SELECT 
    GROUP_ID, 
    LPAD('-',LEVEL,'-')|| GROUP_NAME GROUP_NAME, 
    SYS_CONNECT_BY_PATH(GROUP_NAME, '->') || ',' GROUP_NAME_PATH 
FROM GROUPS 
    START WITH PARENT_ID IS NULL AND GROUP_TYPE='G' 
    CONNECT BY PRIOR GROUP_ID=PARENT_ID) 
    WHERE HIYERARSI_ID NOT LIKE '%,24,%' 

24가 url에서옵니다.

큰 데이터가있을 때 미래에 효율적인 솔루션이 될 수 없다고 생각합니다.

경로에이 ID가 포함되어 있는지 확인하려면 어떻게해야합니까? 코드 아래

+0

찾기 위해 다시 작성에 대해 단지 부모가 Child_id = 24 또는 유사한 시작하는 방법? – Randy

답변

2

는 그룹 번호 (24)와 모든 자식을 제거합니다 :

SELECT 
GROUP_ID, 
LPAD('-',LEVEL,'-')|| GROUP_NAME GROUP_NAME, 
SYS_CONNECT_BY_PATH(GROUP_NAME, '->') GROUP_NAME_PATH 
FROM GROUPS 
START WITH PARENT_ID IS NULL AND TYPE='G' 
AND GROUP_ID <> 24 /* added condition */ 
CONNECT BY PRIOR GROUP_ID=PARENT_ID 
AND GROUP_ID <> 24 /* added condition */