1

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は自己子化できないため、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が含まれているかどうかをよりスマートに検出するにはどうすればよいですか?

4

1 に答える 1

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 */
于 2012-05-04T21:50:06.213 に答える