2016-05-21 14 views
0

私は、特定のユーザーの可能性があるすべてのセキュリティプロジェクトアクセス番号を一覧表示するテーブルを持っています。私はOracle階層型クエリの出力形式

Security 
--------- 
8055 
8055.01 
8056 
8056.00 
8056.01 
8056.01.01 
9005.01.02 
9876.03 

私は私たちのツリービューアプリケーション

Security  Parent ID Group ID Level No 
------------------------------------------------ 
8055   null   1   1 
8055.01  8055   1   2 
8056   null   2   1 
8056.00  8056   2   2 
8056.01  8056   2   2 
8056.01.01  8056.01   2   3 
9005.01.02  null   3   1 
9876.03  null   4   1 

いずれかが上記の出力形式を得るために私を助けることができるための便利なフォーマットで出力テーブルを取得しようとしています、のOracle DBを使用していますか?

答えて

1

Oracleのセットアップ

CREATE TABLE Table_name (Security) AS 
SELECT '8055' FROM DUAL UNION ALL 
SELECT '8055.01' FROM DUAL UNION ALL 
SELECT '8056' FROM DUAL UNION ALL 
SELECT '8056.00' FROM DUAL UNION ALL 
SELECT '8056.01' FROM DUAL UNION ALL 
SELECT '8056.01.01' FROM DUAL UNION ALL 
SELECT '9005.01.02' FROM DUAL UNION ALL 
SELECT '9876.03' FROM DUAL; 

クエリ

WITH parents (security, parent_id) AS (
    SELECT security, 
     SUBSTR(security, 1, INSTR(security, '.', -1) - 1 ) 
    FROM table_name 
) 
SELECT security, 
     PRIOR security AS parent_id, 
     DENSE_RANK() OVER (ORDER BY CONNECT_BY_ROOT(security)) AS group_id, 
     LEVEL AS level_no 
FROM parents p 
START WITH NOT EXISTS (SELECT 'X' 
         FROM table_name t 
         WHERE t.security = p.parent_id) 
CONNECT BY PRIOR security = parent_id 
ORDER BY security; 

出力

SECURITY PARENT_ID GROUP_ID LEVEL_NO 
---------- ---------- ---------- ---------- 
8055       1   1 
8055.01 8055    1   2 
8056       2   1 
8056.00 8056    2   2 
8056.01 8056    2   2 
8056.01.01 8056.01    2   3 
9005.01.02      3   1 
9876.03      4   1 
+0

恐ろしいです。ありがとう。 – vamsivanka