我有一个表“temp”,它的 id 及其直接父级的 id 作为列。表格如下:
1
/ \
2 3
/|\ \
4 5 6 7
/
8
节点的层次结构可以用上面的树结构表示。
现在,我想使用具有级别(如 Level1、Level2 等)作为其属性的递归 cte列出枢轴表中所有级别中存在的每个节点的所有祖先或父节点。为了得到这个输出,我计算了非透视表中的所有父节点,每个节点相对于其父节点的级别。其 sql 查询如下:
WITH ctetable as
(
SELECT S.id, S.parent, 1 as level
FROM temp as S where S.parent is not null
UNION ALL
SELECT S2.id, p.parent, p.level + 1
FROM ctetable AS p JOIN temp as S2 on S2.parent = p.id
)
SELECT * FROM ctetable ORDER BY id;
上述查询的输出如下所示:
但是,我想在特定节点的每个级别下旋转包含父 id 的递归 cte。比如说,对于 id=4,它应该在 Level3、Level2 和 Level1 下分别显示父 id 4、2 和 1。为此,我编写了以下查询:
WITH ctetable as
(
SELECT S.id, S.parent, 1 as level
FROM temp as S where S.parent is not null
UNION ALL
SELECT S2.id, p.parent, p.level + 1
FROM ctetable AS p JOIN temp as S2 on S2.parent = p.id
)
SELECT
myid,
[pn].[1] AS [Level1],
[pn].[2] AS [Level2],
[pn].[3] AS [Level3]
FROM
(
SELECT [a].id,
[a].id as myid,
[a].level
FROM ctetable AS [a]
) AS [hn] PIVOT(max([hn].id) FOR [hn].level IN([1],[2],[3])) AS [pn]
但是,输出表不是所需的,因为它包含与特定节点的每个级别下的父 ID 重复的相同 ID,而是应该包含该节点在各个级别下的所有父级。执行上述查询后得到的输出如下所示:
任何人都可以帮我解决这个问题......