【问题标题】:How can I order hierarchy trees by branch in a select statement returning all hierarchy levels?如何在返回所有层次结构级别的选择语句中按分支对层次结构树进行排序?
【发布时间】:2016-02-02 15:59:49
【问题描述】:

这是我当前的 SQL:

SELECT filter_id, parent_id, level_id, match 
FROM t_filters
ORDER BY level_id;  

显示如下:

ID      PARENT  RANK    FILTER VALUE
10004           1       HQ
10002           1       Finance
10006           1       IT
10003   10006   2       HQ - Central
10005   10004   2       HQ - Non Core & Legacy
10001   10005   3       Non Core

我在这里的第一次尝试是按hierarchy_level_id 对记录进行排序,这基本上是排名。

请注意,父字段为空,其中记录位于层次结构的顶部。

此外,分支的长度可以是 1 到 8 个条目(8 是当前最大值,但理论上可以增加 1 或 2)。

我要展示的是以下,应该使用父字段将层次结构的各个分支整理在一起:

ID      PARENT  RANK    FILTER VALUE
10004           1       HQ
10005   10004   2       HQ - Non Core & Legacy
10001   10005   3       Non Core
10002           1       Finance
10006           1       IT
10003   10006   2       HQ - Central

【问题讨论】:

  • 为什么顶层元素100041000210006之间的顺序是?
  • @LukasEder 没有理由 - 我的示例中分支的顺序是偶然的,但考虑到这一点,我会按过滤值的字母顺序排列它们。

标签: sql select oracle11g


【解决方案1】:

以下解决方案按id 对兄弟姐妹进行排序。在您的 cmets 中,您提到希望通过(过滤器)value 对兄弟姐妹进行排序。只需替换相关表达式即可实现。

使用递归 SQL、Oracle 语法:

SELECT *
FROM t_filters
START WITH parent IS NULL
CONNECT BY parent = PRIOR id
ORDER SIBLINGS BY id

或者,SQL 标准语法(标准和一些数据库需要RECURSIVE 关键字,但 Oracle 不允许这样做)。有点乏味,但更可扩展:

WITH /* RECURSIVE */ r (id, parent, rank, value, path) AS (
  SELECT id, parent, rank, value, '' || id
  FROM t_filters
  WHERE parent IS NULL

  UNION ALL

  SELECT f.id, f.parent, f.rank, f.value, r.path || '/' || f.id
  FROM r
  JOIN t_filters f ON r.id = f.parent
)
SELECT *
FROM r
ORDER BY path

【讨论】:

  • 吹毛求疵:“SQL 标准语法”会要求在 CTE 名称前使用 recursivewith recursive cte (...) as (...) - 但 Oracle 不符合标准在这里。
  • @a_horse_with_no_name:你说的很对,不过,我必须说,我不介意甲骨文在这方面的偏差。
  • @LukasEder 很好的答案,谢谢,尽管在对父级进行递归排序后设置分支的顺序时,我遇到了标准 SQL 的问题。我在unionselects 中都命名了path 列。没能解决这个问题。
  • @Adam:对不起,我不太清楚你的意思。但如果您提出新问题,我将非常乐意提供帮助
猜你喜欢
  • 2016-05-21
  • 2013-01-31
  • 2022-01-08
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
相关资源
最近更新 更多