我的问题是我在SQL中具有此功能性CTE语句。可以为我的ID = 13的代理商找到更深的层次结构,这就像一种魅力。
现在我要做的是给我多个ID的结果(更具体地讲,我在树上的所有叶子)。
查找所有叶子的声明在CTE下方列出。
可以做到吗?还是我需要针对每个ID从代码中运行查询?
WITH parents AS (
SELECT id, name, parent_id, 0 AS relative_depth
FROM agencies
where id = 13
UNION ALL
SELECT cat.id, cat.name, cat.parent_id, p.relative_depth - 1
FROM agencies cat, parents p
WHERE cat.id = p.parent_id
)
SELECT parents.id, parents.name as agency, parents.relative_depth FROM parents
id = 13的示例输出:
id name relative_depth
13 D 0
12 C -1
8 B -2
2 A -3
id = 11的示例输出:
id name relative_depth
11 E 0
2 A -1
所以对于下面声明中的四片叶子...
请假声明:
SELECT id
FROM agencies t
WHERE NOT EXISTS (SELECT 1
FROM agencies
WHERE parent_id = t.id)
我想得到这样的结果:
leaf id name relative_depth
13 13 D 0
13 12 C -1
13 8 B -2
13 2 A -3
11 11 E 0
11 2 A -2
. . . .
. . . .
/亲切的问候
答案 0 :(得分:0)
这样对您有用吗,您将在id
字段中保留顶级leaf
,然后在最后的{{1}中指定leaf
条件}:
SELECT
答案 1 :(得分:0)
这不行吗?
WITH parents AS (
SELECT id, name, parent_id, 0 AS relative_depth
FROM agencies
where parent_id is null
UNION ALL
SELECT cat.id, cat.name, cat.parent_id, p.relative_depth - 1
FROM agencies cat, parents p
WHERE cat.id = p.parent_id
)
SELECT parents.id, parents.name as agency, parents.relative_depth FROM parents
我将树上所有根(没有父母的节点)用作递归CTE的种子,所以您应该到达所有叶子。