Oracle PL/SQL 就在根节点查询之前

标签 oracle plsql hierarchical-data

早上好,

所以我有这样的情况: 包含dataID、parentdataID和一些信息的数据表

MyTable
-Name
-WorkingPeriod
-ColorScheme
-ID
-parentID

为了说明这一点,该表的工作原理如下:

W0 (Always, Red)
--W1 (First time, red-blue)
----W2 (First step, red-blue-grey)
----W3 (Second step, red-blue-black)
------W4 (...)
--------W5 (...)
--W6 (Second time, red-green)
----W7 (First step, red-green-grey)
--W8 (Third time, red-pink)

对于每种情况,我都需要获取距离根最近的节点。意思是:

  • 对于W3、W4或W5,我想获取W1信息(第一次,红蓝)
  • 对于 W1,我什么都不想要(或者它自己的信息,可以使用它)
  • 对于 W0,我什么都不想要。

希望我能说得足够清楚。 祝你有美好的一天。

最佳答案

完全归功于 Pablomatico 的起点,看看他的工作扩展,其中包括处理长度不是 2 位数字的 ID,并重新加入源以带回之前的属性-根行:

WITH the_table AS (SELECT 'W0' item_id, NULL parent_id, 'Red' colour FROM DUAL
                   UNION
                   SELECT 'W1' item_id, 'W0' parent_id , 'blue' colour FROM DUAL
                   UNION
                   SELECT 'W2' item_id, 'W1' parent_id, 'Grey' colour  FROM DUAL
                   UNION
                   SELECT 'W3' item_id, 'W1' parent_id, 'Black' colour  FROM DUAL
                   UNION
                   SELECT 'W4' item_id, 'W3' parent_id, 'Mauve' colour  FROM DUAL
                   UNION
                   SELECT 'W5' item_id, 'W4' parent_id, 'Orange' colour  FROM DUAL
                   UNION
                   SELECT 'W6' item_id, 'W0' parent_id, 'Green' colour  FROM DUAL
                   UNION
                   SELECT 'W7' item_id, 'W6' parent_id, 'Grey' colour  FROM DUAL
                   UNION
                   SELECT 'W8' item_id, 'W0' parent_id, 'Pink' colour  FROM DUAL)
SELECT main_tab.item_id, main_tab.colour,main_tab.just_before_root, the_Table.colour
FROM                     
(SELECT item_id,
       colour,
       SYS_CONNECT_BY_PATH(item_id, '/') node_path, 
       CASE WHEN INSTR(SYS_CONNECT_BY_PATH(item_id, '/'),'/',1,2) = 0 THEN NULL
            WHEN INSTR(SYS_CONNECT_BY_PATH(item_id, '/'),'/',1,2) != 0
               AND INSTR(SYS_CONNECT_BY_PATH(item_id, '/'),'/',1,3) = 0 
               THEN SUBSTR(SYS_CONNECT_BY_PATH(item_id, '/'),   INSTR(SYS_CONNECT_BY_PATH(item_id, '/'),'/',1,2)+1)
           ELSE SUBSTR(SYS_CONNECT_BY_PATH(item_id, '/'), INSTR(SYS_CONNECT_BY_PATH(item_id, '/'),'/',1,2)+1,INSTR(SYS_CONNECT_BY_PATH(item_id, '/'),'/',1,3) - INSTR(SYS_CONNECT_BY_PATH(item_id, '/'),'/',1,2) - 1 ) END just_before_root
FROM the_table
CONNECT BY PRIOR item_id = parent_id
START WITH parent_id IS NULL) main_tab
left outer join the_table on  main_tab.just_before_root = the_table.item_id;

返回:

ITEM_ID   COLOUR   JUST_BEFORE_ROOT    COLOUR_1   
"W0"      "Red"                           
"W1"      "blue"   "W1"                "blue"     
"W2"      "Grey"   "W1"                "blue"     
"W3"      "Black"  "W1"                "blue"     
"W4"      "Mauve"  "W1"                "blue"     
"W5"      "Orange" "W1"                "blue"     
"W6"      "Green"  "W6"                "Green"    
"W7"      "Grey"   "W6"                "Green"    
"W8"      "Pink"   "W8"                "Pink"     

关于Oracle PL/SQL 就在根节点查询之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33348553/

相关文章:

java - oracle long raw 的 hibernate 映射

sql - ORA-38104: UPDATE SET 的 LHS 包含 ON 子句中引用的列

html - 如何从 HTML 中提取链接?

c# - 在 Silverlight 中显示与复选框关联的分层数据

MySQL 对行组进行排序

sql - ORA-01821 : date format not recognized error for ISO 8601 date with local time

oracle - 1000万条记录的sql更新需要4天

plsql - Oracle APEX 使用转换规则在数据加载期间验证输入

c# - 将项目列表转换为树的通用方法

linux - Oracle:创建 keystore