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