0

我们有一个 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 代码中执行此操作的事实。

4

1 回答 1

2

与其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) 开始并对结果进行排序。

于 2012-11-20T23:13:44.163 回答