我们有一个 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 WITH
和 ORDER 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
)开始,并对结果进行排序。