2012-05-04 6 views
0

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

Это мой стол,

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 строк, но я хочу, чтобы скрыть все пути строки, которая содержит GROUP_ID = 24 потому, что группа не может быть selfchild.

Я нашел временное решение с этим запросом;

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.

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

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

+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 */