Может ли самоссылка таблицы поворачиваться, чтобы показать родословную семьи для каждого ребенка с числом поколений, дающим начало названиям каждого столбца? - PullRequest
1 голос
/ 13 февраля 2020

У меня есть таблица ссылок на родителей и детей, на которую я ссылаюсь, и я написал рекурсивный CTE, поэтому у меня теперь есть список отношений между родителями и детьми с их глубиной, то есть в каком поколении они находятся. Теперь можно поворачиваться это, чтобы показать идентификаторы прабабушек и дедушек в левой колонке, потом бабушек и дедушек в следующей колонке, потом родителей, потом детей и т. д. c. с их соответствующими поколениями в качестве заголовков столбцов, пожалуйста?

например, с данными, которые вы видите, я вставляю в свою временную таблицу, могу ли я получить это, пожалуйста?

Gen0    Gen1        Gen2        Gen3        Gen4
1       2           3           4           5
10      20          100         1000
10      20          200     
10      30
10      40
create table [#Data] ([ParentId] int, [ChildId] int)
insert [#Data] values
    (1, 2)
    , (2, 3)
    , (3, 4)
    , (4, 5 )
    , (10, 20)
    , (10, 30)
    , (10, 40)
    , (20, 100)
    , (20, 200)
    , (200, 1000)

;with [CTE] AS
    (
    select [A].[ParentId], [A].[ChildId], 1 as [Generation]
    from [#Data] [A]
    left join [#Data] [B]
        on [A].[ParentId] = [B].[ChildId]
    where [B].[ChildId] is null
    union all
    select [D].[ParentId], [D].[ChildId], [Generation] + 1
    from [CTE] [C]
    join [#Data] [D]
        on [C].[ChildId] = [D].[ParentId]
    )
    select * from [CTE] order by [ParentId], [ChildId]

I Я использую SQL 2017. Большое спасибо за поиск.

1 Ответ

0 голосов
/ 03 мая 2020

Вы можете использовать что-то подобное для запроса вашего 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

Результат:

enter image description here

См. Полный код здесь . Это стандартное c решение, если вам нужно что-то, что работает с произвольным числом поколений, вам придется преобразовать этот код в динамический c T SQL.

PS Я думаю, что есть Вероятно, это опечатка в ожидаемых результатах: в третьем ряду столбец Gen3 должен находиться в третьей строке, а не во второй, поскольку 1000 является дочерним элементом 200, а не 100

...