簡體   English   中英

在Oracle中獲取層次結構數據的父路徑

[英]Get parent path of hierarchical data in oracle

我有三個表,CATEGORY,GROUPING和PERFORMER,在給定上下文的情況下,當類別ID或分組ID或表演者ID為提供的話,我需要獲取給定id的整個父路徑。 如何在Oracle中使用SQL獲取它

在此處輸入圖片說明

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

堆棧溢出不是一個編碼站點,您應該始終包含所嘗試內容的示例。 就是說,我覺得這很有趣,我想自己嘗試一下。

這是一種完全蠻力的方法。 我從每個級別提取層次結構,然后使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM