Поиск в пути, созданном SYS_CONNECT_BY_PATH в Connect By Prior Query

Я использую запрос Connect By для отображения иерархических групп в группе, на этой странице у меня есть поле со списком для выбора родительских групп. Но я хочу скрыть все строки, содержащие редактируемую группу.

Это мой стол,

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 показаны все эти строки, но я хочу скрыть все пути к строкам, которые содержат 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.

Я думаю, что это не будет эффективным решением в будущем, когда мы получим большие данные.

Как я могу более умно определить, содержит ли путь этот идентификатор или нет?


person Tufan Barış Yıldırım    schedule 04.05.2012    source источник
comment
как насчет того, чтобы переписать, чтобы найти только родителей START WITH Child_id = 24 или подобное?   -  person Randy    schedule 04.05.2012


Ответы (1)


Ниже код удалит группу номер 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 */
person arturro    schedule 04.05.2012