如何通过返回所有层次结构级别的select语句中的分支来订购层次结构树?

时间:2015-11-02 17:15:46

标签: sql select oracle11g

这是我目前的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

1 个答案:

答案 0 :(得分:3)

以下解决方案按id命令兄弟姐妹。在您的评论中,您提到过想要通过(过滤器)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