2012-05-04 11 views
0

私はConnect Byクエリを使用してグループに階層グループを表示しています。このページでは、親グループを選択するためのComboboxがあります。しかし、現在編集中のグループを含むすべての行を非表示にしたい。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 */