前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >层次树展开问题

层次树展开问题

作者头像
用户1148526
发布2019-05-25 19:44:48
5120
发布2019-05-25 19:44:48
举报
文章被收录于专栏:Hadoop数据仓库Hadoop数据仓库

在数据仓库的层次建模时,常用递归的方式表示一颗层次树,但有些BI工具的前端不支持递归,所以为了实现数据下钻,可以把一棵递归树进行扩展。

代码语言:javascript
复制
-- 建立原始树表,并生成数据

CREATE TABLE TREE
(
   C_PARENT   INTEGER,
   C_CHILD    INTEGER
);

INSERT INTO TREE (C_PARENT, C_CHILD)
     VALUES (NULL, 1002);

INSERT INTO TREE (C_PARENT, C_CHILD)
     VALUES (1002, 1003);

INSERT INTO TREE (C_PARENT, C_CHILD)
     VALUES (1002, 1004);

INSERT INTO TREE (C_PARENT, C_CHILD)
     VALUES (1002, 1005);

INSERT INTO TREE (C_PARENT, C_CHILD)
     VALUES (1003, 1006);

INSERT INTO TREE (C_PARENT, C_CHILD)
     VALUES (1003, 1007);

INSERT INTO TREE (C_PARENT, C_CHILD)
     VALUES (1003, 1008);

COMMIT;

-- 建立扩展的树表

CREATE TABLE TREE_EXPLODE
(
   C_PARENT     INTEGER,                              -- 父节点
   C_CHILD      INTEGER,                              -- 子节点
   C_LEVEL      INTEGER,                              -- 父节点所在层级
   C_DISTANCE   INTEGER,                              -- 父节点到子节点的层数
   C_BOTTOM     CHAR (1 BYTE),                        -- 是否叶子节点
   C_SEQ        VARCHAR2 (100 BYTE),                  -- 从树根到子节点的路径
   EFF_DT       DATE,                                 -- 生效日期,用于维护历史信息
   EXP_DT       DATE                                  -- 失效日期,用于维护历史信息
);


-- 建立存储过程生成扩展树表数据

CREATE OR REPLACE PROCEDURE p_tree_explode
IS
BEGIN
   FOR x IN (    SELECT c_child, LEVEL c_level
                   FROM tree
             START WITH c_parent IS NULL
             CONNECT BY PRIOR c_child = c_parent)
   LOOP
      INSERT INTO tree_explode (c_parent,
                                c_child,
                                c_level,
                                c_distance,
                                c_bottom,
                                c_seq,
                                eff_dt,
                                exp_dt)
             SELECT CONNECT_BY_ROOT a.c_child,
                    a.c_child,
                    x.c_level,
                    LEVEL - 1,
                    DECODE (CONNECT_BY_ISLEAF, 1, 'Y', 'N'),
                    (    SELECT SYS_CONNECT_BY_PATH (c_child, '/')
                           FROM tree
                          WHERE c_child = a.c_child
                     START WITH c_parent IS NULL
                     CONNECT BY PRIOR c_child = c_parent),
                    TRUNC (SYSDATE),
                    TO_DATE ('9999-12-31', 'yyyy-mm-dd')
               FROM tree a
         START WITH a.c_child = x.c_child
         CONNECT BY PRIOR a.c_child = a.c_parent;
   END LOOP;

   COMMIT;
END;
/

-- 测试
TRUNCATE TABLE tree_explode;
EXEC p_tree_explode;

SELECT * FROM tree_explode;
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年12月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档