如何将分层数据转换为单独的列

问题描述 投票:0回答:1

我有一个要求,数据如下表所示,其中 PL-79 没有父记录。 我提供了包含 4 个级别的样本数据,但实际情况中级别数大于 4。

我的亲子桌:

输入

家长 孩子
PL-79 08
PL-79 30
30 20
30 25
30 21
21 09-A
21 09-b

我想将父子表转入此表: 需要输出

1级 2级 3级 4级
PL-79 08
PL-79 30 20
PL-79 30 25
PL-79 30 21 09-A
PL-79 30 21 09-b

如果有人为我们提供 prestoDB 中的解决方案,那就太好了,因为 presto 不适用于递归 cte。如果不是简单的 SQL 服务器解决方案就可以了。

sql-server presto
1个回答
0
投票

您可以使用 SQL Server 中的递归公用表表达式 (CTE) 来实现所需的输出。这是针对您的问题的 SQL Server 解决方案:

WITH RecursiveCTE AS (
    SELECT Parent AS lvl1, Child AS lvl2, NULL AS lvl3, NULL AS lvl4
    FROM ParentChild
    WHERE Parent NOT IN (SELECT Child FROM ParentChild)

    UNION ALL

    SELECT r.lvl1, pc.Child AS lvl2, NULL AS lvl3, NULL AS lvl4
    FROM RecursiveCTE r
    JOIN ParentChild pc ON r.lvl2 = pc.Parent

    UNION ALL

    SELECT r.lvl1, r.lvl2, pc.Child AS lvl3, NULL AS lvl4
    FROM RecursiveCTE r
    JOIN ParentChild pc ON r.lvl2 = pc.Parent

    UNION ALL

    SELECT r.lvl1, r.lvl2, r.lvl3, pc.Child AS lvl4
    FROM RecursiveCTE r
    JOIN ParentChild pc ON r.lvl3 = pc.Parent
)

SELECT * FROM RecursiveCTE
WHERE lvl1 IS NOT NULL
ORDER BY lvl1, lvl2, lvl3, lvl4;

当然,如果您使用的 PrestoDB 不支持递归 CTE,则可以通过使用自连接实现类似的结果,而无需递归。这是一种无需递归即可将父子表转换为所需格式的方法:

sql

SELECT 
    pc1.Parent AS lvl1,
    pc2.Parent AS lvl2,
    pc3.Parent AS lvl3,
    pc4.Child AS lvl4
FROM ParentChild pc1
LEFT JOIN ParentChild pc2 ON pc1.Child = pc2.Parent
LEFT JOIN ParentChild pc3 ON pc2.Child = pc3.Parent
LEFT JOIN ParentChild pc4 ON pc3.Child = pc4.Parent
WHERE pc1.Parent IS NOT NULL
ORDER BY lvl1, lvl2, lvl3, lvl4;
© www.soinside.com 2019 - 2024. All rights reserved.