Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在oracle中查找层次结构中的最后一个子级_Sql_Oracle_Oracle10g_Hierarchical Query - Fatal编程技术网

Sql 在oracle中查找层次结构中的最后一个子级

Sql 在oracle中查找层次结构中的最后一个子级,sql,oracle,oracle10g,hierarchical-query,Sql,Oracle,Oracle10g,Hierarchical Query,我有一张像这样的桌子 prnt_id child_id ----------------- 1 2 2 4 3 5 6 7 7 8 8 9 我的结果应该包含 prnt_id child_id ----------------- 1 4 3 5 6 9 我正在使用oracle 10g 我尝试使用“连接方式”执行此操作,但没有得到预期的结果 使用CONNE

我有一张像这样的桌子

prnt_id   child_id
-----------------
1           2
2           4
3
5
6           7
7           8
8           9
我的结果应该包含

prnt_id  child_id
-----------------
1          4
3
5
6          9
我正在使用oracle 10g


我尝试使用“连接方式”执行此操作,但没有得到预期的结果

使用CONNECT_BY_ROOT从根获取prnt_id,并使用CONNECT_BY_ISLEAF指示叶节点所在的位置。类似的方法应该会奏效:

SELECT PRNT_ID, 
       CHILD_ID
FROM (SELECT CONNECT_BY_ROOT PRNT_ID PRNT_ID, CHILD_ID, CONNECT_BY_ISLEAF leaf 
      FROM TABLE
      CONNECT BY PRIOR CHILD_ID = PRNT_ID
      START WITH prnt_id NOT IN (SELECT CHILD_ID
                                 FROM TABLE
                                 WHERE CHILD_ID IS NOT NULL))
WHERE leaf = 1
例如,这将为您提供所需的结果:

WITH dat AS (SELECT 1 prnt_id, 2 child_id FROM DUAL
             UNION ALL
             SELECT 2 prnt_id, 4 child_id FROM DUAL
             UNION ALL
             SELECT 3 prnt_id, NULL child_id FROM DUAL
             UNION ALL
             SELECT 5 prnt_id, NULL child_id FROM DUAL
             UNION ALL
             SELECT 6 prnt_id, 7 child_id FROM DUAL
             UNION ALL
             SELECT 7 prnt_id, 8 child_id FROM DUAL
             UNION ALL             
             SELECT 8 prnt_id, 9 child_id FROM DUAL)
SELECT PRNT_ID, 
       CHILD_ID
FROM (SELECT CONNECT_BY_ROOT PRNT_ID PRNT_ID, CHILD_ID, CONNECT_BY_ISLEAF leaf FROM dat
      CONNECT BY PRIOR CHILD_ID = PRNT_ID
      START WITH prnt_id NOT IN (SELECT CHILD_ID
                                 FROM dat
                                 WHERE CHILD_ID IS NOT NULL))
WHERE leaf = 1


PRNT_ID CHILD_ID
1       4
3   
5   
6       9

您当前的代码是什么?你能详细说明你想做什么吗?我正在尝试获取根节点的最后一个节点,而不管它与什么直接或间接相关。谢谢@Mikhail..这成功了。我正在做的是选择CONNECT\U BY\U ROOT PRNT\U ID PRNT\U ID,CHILD\U ID,CONNECT\U BY\U ISLEAF leaf FROM dat CONNECT BY PRNT\U ID=PRNT\U ID从PRNT\U ID开始。