【问题标题】:How to extract a hierarchical structure from a flat table?如何从平面表中提取层次结构?
【发布时间】:2019-10-03 11:26:00
【问题描述】:

我想从 oracle 数据库中的表中提取层次结构。 表格如下所示:

+----+--------+----------------+---------------------+
| id | lvl1   | lvl2           | lvl3                | 
+----+--------+----------------+---------------------+
| 1  | Oracle | Marketing unit | Internet            | 
+----+--------+----------------+---------------------+
| 2  | Oracle | Lawyers unit   | Intellectual        | 
+----+--------+----------------+---------------------+
| 3  | Oracle | Finance unit   | null                |
+----+--------+----------------+---------------------+
| 4  | Oracle | Lawyers unit   | Judicial department | 
+----+--------+----------------+---------------------+
| 5  | Oracle | IT unit        | Database            |
+----+--------+----------------+---------------------+
| 6  | Oracle | Marketing unit | Television          | 
+----+--------+----------------+---------------------+
| 7  | Oracle | IT unit        | ERP                 | 
+----+--------+----------------+---------------------+

这就是我想要得到的:

- Oracle
. - Marketing unit
.   - Internet
.   - Television 
. - Lawyers unit
.   - Intellectual
.   - Judicial department
. - Finance unit
. - IT unit
.   - Database
.   - ERP

我阅读了有关 Oracle 分层查询的信息,但我不知道如何使用我的表结构来实现它... 最后,我必须让 JSON 显示在网页上。 为了方便,我在sqlfiddle 上准备了一张桌子

感谢您的帮助, 有什么想法吗?

【问题讨论】:

    标签: sql oracle hierarchy hierarchical-data


    【解决方案1】:

    一种方法如下(使用UNPIVOT):

    WITH unpiv AS (SELECT lvl, par, cur, MIN(id) id FROM HIERARCHY_SAMPLE
                   unpivot ((par, cur) for lvl in ((lvl1 /*Something here - it doesn't really matter */,lvl1) as 1
                                                  ,(lvl1,lvl2) as 2
                                                  ,(lvl2,lvl3) as 3))
                    WHERE cur IS NOT NULL
                   GROUP BY lvl,par,cur)
    SELECT LPAD('- ', LEVEL*2)||cur 
      FROM unpiv
    START WITH lvl = 1
    CONNECT BY lvl = PRIOR lvl + 1
           AND par = PRIOR cur
    ORDER siblings BY id
    

    【讨论】:

    • 它看起来很棒,这就是我想要的,谢谢!有没有办法使用 oracle 将其作为 JSON 获取?
    猜你喜欢
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多