2017-11-09 7 views
0

カテゴリーの直属の子が他のカテゴリまたはグループまたはパフォーマーになる可能性のある3つのテーブルCATEGORY、GROUPINGおよびPERFORMERがあり、このコンテキストではグループ化の子は他のグループまたはパフォーマーカテゴリidまたはグループ化idまたはperformer idが指定されている場合、与えられたidの親パス全体を取得する必要があります。オラクルoracleで階層データの親パスを取得

enter image description here

if performer_id= 300 then result should be 300->202->201->101->100 
if grouping_id = 203 then result should be 203->102->101->100 
if category_id = 103 then result should be 103->101->100 

答えて

0

スタックオーバーフローでSQLを使用してそれを取得する方法あなたは常にあなたがしようとしているものの例を含める必要があり、コーディングサイトではありません。それは私がこれをとても興味をそそられると感じた、私はそれを自分自身で試してみると思いました。

これは全くブルートフォース方式です。私は、それらを一緒に持ってLISTAGGを使用し、各レベルから階層を抽出します。

WITH 
    category 
    AS 
     (SELECT '100' category_id, NULL parent_id 
      FROM DUAL 
     UNION ALL 
     SELECT '101' category_id, '100' parent_id 
      FROM DUAL 
     UNION ALL 
     SELECT '102' category_id, '101' parent_id 
      FROM DUAL 
     UNION ALL 
     SELECT '103' category_id, '101' parent_id 
      FROM DUAL), 
    GROUPING 
    AS 
     (SELECT '200' GROUPING_ID, NULL parent_id, '101' category_id 
      FROM DUAL 
     UNION ALL 
     SELECT '201' GROUPING_ID, '200' parent_id, '101' category_id 
      FROM DUAL 
     UNION ALL 
     SELECT '202' GROUPING_ID, '201' parent_id, '101' category_id 
      FROM DUAL 
     UNION ALL 
     SELECT '203' GROUPING_ID, NULL parent_id, '102' category_id 
      FROM DUAL), 
    performer 
    AS 
     (SELECT '300' performer_id, '202' GROUPING_ID, '101' category_id 
      FROM DUAL 
     UNION ALL 
     SELECT '301' performer_id, '201' GROUPING_ID, '101' category_id 
      FROM DUAL 
     UNION ALL 
     SELECT '302' performer_id, '203' GROUPING_ID, '103' category_id 
      FROM DUAL 
     UNION ALL 
     SELECT '303' performer_id, NULL GROUPING_ID, '102' category_id 
      FROM DUAL), 
    pset (p_gid, p_parentid, p_catid) 
    AS 
     (SELECT GROUPING.GROUPING_ID, parent_id, GROUPING.category_id 
      FROM performer INNER JOIN GROUPING ON performer.GROUPING_ID = GROUPING.GROUPING_ID 
      WHERE performer_id = '300' 
     UNION ALL 
     SELECT GROUPING_ID, parent_id, category_id 
      FROM pset INNER JOIN GROUPING ON GROUPING_ID = p_parentid), 
    cset (p_catid, p_parent) 
    AS 
     (SELECT p_catid, parent_id 
      FROM pset INNER JOIN category ON pset.p_catid = category.category_id 

     UNION ALL 
     SELECT category_id, parent_id 
      FROM cset INNER JOIN category ON category_id = p_parent), 
    dset 
    AS 
     (SELECT p_catid 
      FROM cset 
     UNION 
     SELECT p_gid 
      FROM pset 
     UNION 
     SELECT '300' 
      FROM DUAL) 
SELECT LISTAGG (p_catid, '->') WITHIN GROUP (ORDER BY p_catid DESC) AS performer_chain 
    FROM dset 

そして、答えは

PERFORMER_CHAIN 
300->202->201->200->101->100 
です
関連する問題