【问题标题】:Is there a way to sort by hierarchy when the result set comes from a self referencing table?当结果集来自自引用表时,有没有办法按层次结构排序?
【发布时间】:2012-11-20 21:24:08
【问题描述】:

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

【问题讨论】:

    标签: sql oracle self-reference


    【解决方案1】:

    与其使用LEVEL 并尝试以巧妙的方式管理结果,不如使用START WITHORDER SIBLINGS BY 来获得您正在寻找的结果:

    SQL Fiddle

    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
    

    Results

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

    【讨论】:

    • 哇。谢谢。那是一些严肃的甲骨文绝地武士。
    猜你喜欢
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2019-07-31
    • 1970-01-01
    相关资源
    最近更新 更多