我有一个如下表的表
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。
这有意义吗?有人可以帮我吗?
答案 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
答案 1 :(得分:0)
在您的SQL中,使用:SELECT TOP 2 * FROM ...
这只会获取他发现的前2行。 (这是SQL Server的语法)