如何在SQL中获得父级的前2个子级?

时间:2018-12-13 10:43:00

标签: sql sql-server-2012

我有一个如下表的表

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

您可以看到所有父级和子级都在同一张表中。我需要从中创建一个视图,其中显示每个底层儿童的ID和名称,其上一个儿童的ChildID和名称,然后是它们的最高父级。上面对于威尔士的输出看起来像下面的

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

有时候,孩子的父母人数可能有所不同。在上面的示例中,ChildID 127具有3个父母。有时可能会更多,但我们始终需要查看最低的2。

这有意义吗?有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用带有条件加重功能的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

答案 1 :(得分:0)

在您的SQL中,使用:SELECT TOP 2 * FROM ... 这只会获取他发现的前2行。 (这是SQL Server的语法)