SQL对多个值重复CTE

时间:2019-09-16 07:50:29

标签: sql sql-server common-table-expression recursive-query

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

/亲切的问候

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