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