Sql server 自引用表是否可以透视以显示每个子级的家族血统,并使用生成计数生成每个列的名称?
我有一个父母和孩子的自参考表,我写了一个递归的CTE,所以我现在有一个父母和孩子关系的列表,以及他们的深度,也就是他们所处的时代。 现在是否可以在左列中显示曾祖父母的ID,然后在下一列中显示祖父母的ID,然后显示父母的ID,然后显示孩子的ID等,并将他们各自的世代作为列标题 e、 g.根据您看到的数据,我正在插入我的临时表,我可以得到这个吗Sql server 自引用表是否可以透视以显示每个子级的家族血统,并使用生成计数生成每个列的名称?,sql-server,recursion,pivot,parent-child,common-table-expression,Sql Server,Recursion,Pivot,Parent Child,Common Table Expression,我有一个父母和孩子的自参考表,我写了一个递归的CTE,所以我现在有一个父母和孩子关系的列表,以及他们的深度,也就是他们所处的时代。 现在是否可以在左列中显示曾祖父母的ID,然后在下一列中显示祖父母的ID,然后显示父母的ID,然后显示孩子的ID等,并将他们各自的世代作为列标题 e、 g.根据您看到的数据,我正在插入我的临时表,我可以得到这个吗 Gen0 Gen1 Gen2 Gen3 Gen4 1 2 3
Gen0 Gen1 Gen2 Gen3 Gen4
1 2 3 4 5
10 20 100 1000
10 20 200
10 30
10 40
我正在使用SQL 2017。
非常感谢您的关注。您可以使用以下内容来查询您的CTE:
;with [CTE] AS
(/*your code here*/)
select
g1.[ParentId] as Gen0
, coalesce(g1.[ChildId], g2.[ParentId]) as Gen1
, coalesce(g2.[ChildId], g3.[ParentId]) as Gen2
, coalesce(g3.[ChildId], g4.[ParentId]) as Gen3
, g4.[ChildId] as Gen4
from
[CTE] as g1
left join [CTE] as g2 on g1.[ChildId] = g2.[ParentId]
left join [CTE] as g3 on g2.[ChildId] = g3.[ParentId]
left join [CTE] as g4 on g3.[ChildId] = g4.[ParentId]
where g1.[Generation] = 1
结果:
请参阅完整的代码。这是一个静态的解决方案,如果您想要使用任意代数的代码,则必须在动态TSQL中转换此代码
另外,我认为您的预期结果可能有误:在Gen3中,第1000列应该在第三行,而不是第二行,因为1000是200的子代,而不是100的子代
;with [CTE] AS
(/*your code here*/)
select
g1.[ParentId] as Gen0
, coalesce(g1.[ChildId], g2.[ParentId]) as Gen1
, coalesce(g2.[ChildId], g3.[ParentId]) as Gen2
, coalesce(g3.[ChildId], g4.[ParentId]) as Gen3
, g4.[ChildId] as Gen4
from
[CTE] as g1
left join [CTE] as g2 on g1.[ChildId] = g2.[ParentId]
left join [CTE] as g3 on g2.[ChildId] = g3.[ParentId]
left join [CTE] as g4 on g3.[ChildId] = g4.[ParentId]
where g1.[Generation] = 1
结果:
请参阅完整的代码。这是一个静态的解决方案,如果您想要使用任意代数的代码,则必须在动态TSQL中转换此代码
另外,我认为您的预期结果可能有误:在Gen3中,第1000列应该在第三行,而不是第二行,因为1000是200的孩子,而不是100的孩子