Как получить первых 2 детей родителей в SQL? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть таблица, которая выглядит следующим образом

ID          Name          ParentID
333          UK            NULL
124         Wales          333
126        Swansea         124
127       Llanrhidian      126

Как вы можете видеть, все родители и дети находятся в одной таблице.Мне нужно создать вид из этого, который показывает идентификатор и имя для каждого нижнего уровня Child, ChildID и Name одного над ним, а затем родительский уровень самого высокого из них.Результат вышеупомянутого для Уэльса будет выглядеть следующим образом:

ChildID1     Child1Name     ChildID2     Child2Name   ParentID   ParentName
 127        Llanrhidian     126          Swansea        333        England

Иногда число родителей ребенка может быть различным.В приведенном выше примере ChildID 127 имеет 3 родителей.Иногда это может быть больше, но нам всегда нужно видеть самое низкое 2.

Имеет ли это смысл?Может ли кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

В вашем SQL используйте: SELECT TOP 2 * FROM ... Это принесет только первые 2 строки, которые он найдет.(Это синтаксис для SQL Server)

0 голосов
/ 13 декабря 2018

Вы можете попытаться использовать рекурсивную CTE с функцией, усугубленной условием.

первый запрос, использующий рекурсивную CTE, получит все данные рекурсивной связи.

второй запрос использует MAX оконную функцию дляполучить максимальное число, которое означает parentId.

;WITH CTE AS(
    SELECT t1.ID,t1.Name,t1.ParentID,1 num
    FROM T t1 LEFT JOIN T t2 on t1.ID = t2.ParentID
    WHERE t2.ID IS NULL
    UNION ALL
    SELECT t2.ID,t2.NAME,t2.ParentID,num + 1
    FROM  CTE t1 JOIN T t2 ON t1.ParentID = t2.ID
),CTE2 AS (

    SELECT *,MAX(num) OVER(ORDER BY num desc) maxNum
    FROM CTE
)
SELECT  MAX(CASE WHEN num = 1 then  ID END) ChildID1,
       MAX(CASE WHEN num = 1 then  name END) Child1Name,
       MAX(CASE WHEN num = 2 then  ID END) ChildID2,
       MAX(CASE WHEN num = 2 then  Name END) Child2Name,
       MAX(CASE WHEN num = maxNum then  ID END) ParentID,
       MAX(CASE WHEN num = maxNum then  Name END) ParentName
FROM CTE2

sqlfiddle

...