gpt4 book ai didi

sql - 开发递归/层次结构查询

转载 作者:行者123 更新时间:2023-12-03 02:20:20 24 4
gpt4 key购买 nike

我需要您帮助解决这个我无法解决的问题。事情是这样的,假设我有一个这样的表:

Father | Son
1 | 2
1 | 3
1 | 4
3 | 5
3 | 6
2 | 7
4 | 8
5 | 9
6 | 10

正如你所看到的,该表代表了父子关系,我需要找到一个父亲的所有儿子(以及儿子的儿子),例如,如果我寻找 1 号的儿子,我们将得到像这样的表

Father | son
1 | 2
1 | 3
1 | 4
1 | 5
1 | 6
1 | 7
1 | 8
1 | 9
1 | 10

如果我正在寻找 3 号的儿子,我们会得到:

Father | son
3 | 5
3 | 6
3 | 9
3 | 10

好吧,我想你明白我的意思了。下一个问题是我必须为表中的每个父亲做这件事。所以最后的表格如下:

Father | son
1 | 2
1 | 3
1 | 4
1 | 5
1 | 6
1 | 7
1 | 8
1 | 9
1 | 10
3 | 5
3 | 6
3 | 9
3 | 10
2 | 7
4 | 8
5 | 9
6 | 10

与翻越一棵树非常相似。我一直试图找出这个查询一段时间但没有成功。我做了这样的代码

WITH  son
AS (
-- in
SELECT FK_CC_B
FROM PG_Rols_CC
WHERE FK_CC_A = @idCC
UNION ALL
--recur
SELECT t.FK_CC_B
FROM PG_Rols_CC AS t
JOIN hijos AS a
ON t.FK_CC_A = a.FK_CC_B
)
insert into @TableSons (idSon) SELECT * FROM son

但是它不能同时对每个父亲起作用,并且结果表有点不同,它只有儿子的 ID。示例

son
3
4
5
6
7

希望你能帮助我。

最佳答案

如果您想获取所有父亲的后代,则需要删除公共(public)表表达式 (CTE) 第一部分中的 WHERE 子句。

如果要输出两列(父亲和后代),则需要将这些列添加到 CTE 的两个部分。

像这样:

WITH Son
AS
(
SELECT
FK_CC_A AS Father,
FK_CC_B AS Son
FROM
PG_Rols_CC
UNION ALL
SELECT
f.Father,
s.FK_CC_B AS Son
FROM
Son f
INNER JOIN PG_Rols_CC s ON f.Son = s.FK_CC_A
)

SELECT * FROM Son

关于sql - 开发递归/层次结构查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13593763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com