Sql 将N个列取消拆分为一行

Sql 将N个列取消拆分为一行,sql,sql-server,Sql,Sql Server,我有一个表,其中包含所有文件夹的id及其对应的父id 我想导出文件夹的所有父文件夹,但我需要这些文件夹仅位于一列中 我正在尝试使用透视表来实现这一点,但由于某些原因,它将不起作用。所有在线pivot示例都包含聚合函数。我是否也必须在中实现一个才能使其工作?我想我不知道 SELECT * FROM (SELECT F.Id, F1.Id, F2.Id, F3.Id, F4.Id, F5.Id, F5.ParentId FROM Folder F LEFT JOIN Folder F1 O

我有一个表,其中包含所有文件夹的id及其对应的父id

我想导出文件夹的所有父文件夹,但我需要这些文件夹仅位于一列中

我正在尝试使用透视表来实现这一点,但由于某些原因,它将不起作用。所有在线pivot示例都包含聚合函数。我是否也必须在中实现一个才能使其工作?我想我不知道

SELECT * FROM
(SELECT F.Id, F1.Id, F2.Id, F3.Id, F4.Id, F5.Id, F5.ParentId
FROM Folder F 
    LEFT JOIN Folder F1 ON F1.Id = F.ParentId
    LEFT JOIN Folder F2 ON F2.Id = F1.ParentId
    LEFT JOIN Folder F3 ON F3.Id = F2.ParentId
    LEFT JOIN Folder F4 ON F4.Id = F3.ParentId
    LEFT JOIN Folder F5 ON F5.Id = F4.ParentId
WHERE F.Id = '65D33613-9476-4BC8-90AA-2DA622CAA7CD') AS Folders
UNPIVOT(
Idens FOR F.Id IN (Id)
) AS PivotTable

可以使用递归公共表表达式而不是
UNPIVOT

;WITH CTE AS (
    SELECT *, 1 RN FROM Folder WHERE Id = '65D33613-9476-4BC8-90AA-2DA622CAA7CD'
    UNION ALL 
    SELECT F.Id,  F.ParentID, RN+1 RN FROM Folder F INNER JOIN CTE ON F.Id = CTE.ParentID
)
SELECT 'Id_' + CONVERT(VARCHAR,RN) Idens ,  Id FROM CTE
UNION ALL
SELECT * FROM (SELECT TOP 1 'ParentId' Idens , Id FROM CTE ORDER BY RN DESC) AS Parent 

这是一个很好的起点。您可以在需要时使用聚合,该聚合将返回与数据未分组时相同的值。上面查询中的AVG(Fx.ID)将产生与连接谓词中使用的Fx.ID相同的值。