SQL 为多个值重复 CTE

SQL repeat CTE for multiple values

我的问题是 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

所以对于我从下面的语句中得到的 4 个叶子...

留下声明:

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
  .     .   .       .
  .     .   .       .

/亲切的问候

像这样的事情对你有用吗,你可以在 leaf 字段中保留顶级 id,然后在你的最终 [=] 中指定 leaf 标准14=]:

WITH parents AS (
  SELECT id leaf, id, name, parent_id,  0 AS relative_depth
  FROM agencies

  UNION ALL

  SELECT p.leaf, cat.id, cat.name, cat.parent_id, p.relative_depth - 1
  FROM agencies cat, parents p
  WHERE cat.id = p.parent_id
)

SELECT leaf, parents.id, parents.name as agency, parents.relative_depth
FROM parents
WHERE leaf IN (11, 13)

这行不通吗?

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 的种子,因此你应该到达所有叶子。