对多个值重复执行SQL CTE
我的问题是,我在SQL中有这个函数式CTE语句。为我的id=13的机构找到深层次的层次结构就像一个魅力 现在我想让它给我一个多ID的结果(更具体地说是树中的所有叶子) 查找所有叶片的声明在CTE下方说明 这能做到吗?或者我需要为每个ID从代码运行查询吗对多个值重复执行SQL CTE,sql,sql-server,common-table-expression,recursive-query,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
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
标准:
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的种子,因此您应该到达所有叶子。请参阅。请发布一些示例输入和预期输出。如果您想要所有ID,为什么不删除ID=2的?另外,请在1992年以后加入我们:Larnu:删除'where id=2'不会给出每个叶节点的层次关系。Thx!然后我可以在in()部分中添加叶子选择作为内部选择