当结果集来自自引用表时,有没有办法按层次结构排序



我们有一个 Oracle 自引用表来表示类似于以下内容的层次结构:

THING
---------
ID
PARENT_ID
NAME
SOME_DATA

顶级THING有一个null PARENT_ID

我希望能够从此表中进行选择,并按每行在层次结构中的位置(从上到下)对数据进行排序,然后按名称排序,以便数据集:

ID PARENT_ID  NAME SOME_DATA
1       null   top      null
2          1   cat      null
3          1   dog      null
4          2  frog      null
5          1  bird      null
6          2  fish      null

。成为:

ID PARENT_ID  NAME SOME_DATA
1       null   top      null
5          1  bird      null
2          1   cat      null
6          2  fish      null
4          2  frog      null
3          1   dog      null

当我开始输入这个问题时,我很好奇是否有办法在不向表中添加LEVEL列的情况下做到这一点,但现在我什至不确定可以通过添加该列来完成。

在这里,"否"的答案是完全可以接受的,因为我已经接受了我将不得不在我的 Java 代码中执行此操作的事实。

与其使用

LEVEL 并尝试以巧妙的方式管理结果,不如使用 START WITHORDER SIBLINGS BY 来获得所需的结果:

SQL 小提琴

SELECT t.*
FROM thing t
CONNECT BY PRIOR t.id = t.parent_id
START WITH t.parent_id IS NULL
ORDER SIBLINGS BY t.name

结果

| ID | PARENT_ID | NAME | SOME_DATA |
-------------------------------------
|  1 |    (null) |  top |    (null) |
|  5 |         1 | bird |    (null) |
|  2 |         1 |  cat |    (null) |
|  6 |         2 | fish |    (null) |
|  4 |         2 | frog |    (null) |
|  3 |         1 |  dog |    (null) |

这在层次结构中链接,从根(parent_id IS NULL)开始,并对结果进行排序。

相关内容

最新更新