Sql server 自引用表是否可以透视以显示每个子级的家族血统,并使用生成计数生成每个列的名称?

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

我有一个父母和孩子的自参考表,我写了一个递归的CTE,所以我现在有一个父母和孩子关系的列表,以及他们的深度,也就是他们所处的时代。 现在是否可以在左列中显示曾祖父母的ID,然后在下一列中显示祖父母的ID,然后显示父母的ID,然后显示孩子的ID等,并将他们各自的世代作为列标题

e、 g.根据您看到的数据,我正在插入我的临时表,我可以得到这个吗

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的孩子