zoukankan      html  css  js  c++  java
  • 构造一棵完成的树的算法

    业务描述:存在一棵部门树,当前的部门树(DEPT表),用户A(USERS)对树上的一些部门有访问的权限,通过一个配置模块,可以配置用户具有哪些树的节点访问权限,存储在用户部门关系表(USER_DEPTS)中,现在需要构造一棵新的树,需要将用户所有具有选择权限的树,展示出来,(将具有父子关系的节点以父子节点的形式展示出来)展示规则参考如下:

    depts表的数据:

    1 SELECT lpad(' ', LEVEL * 4) || t.dept_names
    2   FROM depts t
    3  START WITH t.parent_id = 'ROOT'
    4 CONNECT BY PRIOR t.id = t.parent_id

    USERS表的数据

    USER_DEPTS表的数据:

     

         那么现在1用户现在有树中三个节点的访问权限,但是,A和A1构成了父子关系,所以,按照业务要求,目前构成的树的形状为十一A和C1同时作为根节点:

    构建树的SQL语句:

    WITH TEMP_DATA AS
     (SELECT COLS.ID,
             COLS.USER_ID,
             COLS.USER_NAME,
             COLS.DEPT_ID,
             COLS.DEPT_NAMES,
             NVL(UD.DEPT_ID, 'ROOT') AS PARENT_ID --构建树的临时父节点
        FROM (SELECT T.ID,
                     T.USER_ID,
                     U.USER_NAME,
                     T.DEPT_ID,
                     D.DEPT_NAMES,
                     D.PARENT_ID
                FROM USER_DEPT T
                LEFT JOIN USERS U
                  ON T.USER_ID = U.ID
                LEFT JOIN DEPTS D
                  ON T.DEPT_ID = D.ID) COLS
        --判断父节点是否也在配置表中
        LEFT JOIN USER_DEPT UD
          ON COLS.PARENT_ID = UD.DEPT_ID)
    SELECT LPAD(' ', LEVEL * 4) || T.DEPT_NAMES
      FROM TEMP_DATA T
     START WITH T.PARENT_ID = 'ROOT'
    CONNECT BY PRIOR T.DEPT_ID = T.PARENT_ID

    --结果:

    I believe that we are who we choose to be. Nobody‘s going to come and save you, you‘ve got to save yourself. 我相信我们成为怎样的人是我们自己的选择。没有人会来拯救你,你必须要自己拯救自己。
  • 相关阅读:
    Java实现找出数组中重复次数最多的元素以及个数
    java经典小算法
    java将数组中的零放到末尾
    BP神经网络
    Centos配置Caffe详解
    JAVA面试题之实现字符串的倒序输出
    Android 发送短信与接收短信
    java 选择排序法
    java数组获取最值
    spring kafka consumer原理解析二
  • 原文地址:https://www.cnblogs.com/caroline/p/2937794.html
Copyright © 2011-2022 走看看