zoukankan      html  css  js  c++  java
  • oracle处理节点之间的父子关系

    通常当与树的结构之间的关系处理,这是一个很复杂的事情,我们可以通过程序代码去逐层遍历父或子节点,这样做的缺点是很明显,效率不高,操作复杂性是比较大的。而当我们使用Oracle当数据库,我们可以有一个简单的解决方法,例如下列:

    1.首先创建一张表。保存父子关系

    drop table tmp_node;

    create table tmp_node(id varchar2(500),p_id varchar2(500));

    2.向表中插入数据

    insert into tmp_node(p_id,id) values(null,1);

    insert into tmp_node(p_id,id) values(1,'1-1');

    insert into tmp_node(p_id,id) values(1,'1-2');

    insert into tmp_node(p_id,id) values('1-1','1-1-1');

    insert into tmp_node(p_id,id) values('1-1','1-1-2');

    insert into tmp_node(p_id,id) values('1-2','1-2-1');

    3.查看表中数据

    select * from tmp_node;

    编号

    P_ID

    ID

    1

    1

    2

    1

    1-1

    3

    1

    1-2

    4

    1-1

    1-1-1

    5

    1-1

    1-1-2

    6

    1-2

    1-2-1

    4.创建视图(这一步最重要)

    create or replace view tmp_node_view as

    select distinct level lvl,connect_by_root(id) leaf_id,t.*

    from tmp_node t

    connect by prior t.p_id = t.id;

    5.查看视图数据

    select  * form tmp_node_view order by leaf_id,lvl;

    编号

    LVL

    LEAF_ID

    ID

    P_ID

    1

    1

    1

    1

    2

    1

    1-1

    1-1

    1

    3

    2

    1-1

    1

    4

    1

    1-1-1

    1-1-1

    1-1

    5

    2

    1-1-1

    1-1

    1

    6

    3

    1-1-1

    1

    7

    1

    1-1-2

    1-1-2

    1-1

    8

    2

    1-1-2

    1-1

    1

    9

    3

    1-1-2

    1

    10

    1

    1-2

    1-2

    1

    11

    2

    1-2

    1

    12

    1

    1-2-1

    1-2-1

    1-2

    13

    2

    1-2-1

    1-2

    1

    14

    3

    1-2-1

    1

    6.使用说明

    主要使用的leaf_id和id两个字段的值。

    字段说明:lvl字段代表节点的深度,leaf_id代表叶节点。

    p_id父节点id。id节点本生id。

    当须要知道一个节点有哪些父节点的时候,仅仅须要依据leaf_id,查询id字段就可以:

    select * from tmp_node_view where leaf_id = '1-2-1';

    编号

    LVL

    LEAF_ID

    ID

    P_ID

    1

    1

    1-2-1

    1-2-1

    1-2

    2

    3

    1-2-1

    1

    3

    2

    1-2-1

    1-2

    1

    当须要知道一个节点有哪些子节点的时候。仅仅须要依据id查询leaf_id就可以:

    select * from tmp_node_view where id = '1-2';

    编号

    LVL

    LEAF_ID

    ID

    P_ID

    1

    1

    1-2

    1-2

    1

    2

    2

    1-2-1

    1-2

    1

    注意:发现所有的父母和孩子节点。包括自身节点是。

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    澳洲中产收入水平[转]
    [转载]在澳洲做IT人士的收入差别
    取消excel 工作保护 密码的宏
    SAP ML 物料分类账详解(含取消激活物料帐方法)
    ABAP--如何创建自定义打印条码
    SAP 产品条码WMS结合 以及ABAP script的集成 BarCode
    SAP 以工序为基准进行发料 机加工行业 Goods Issue to Routing
    SAP HR模块的基础数据表和增强配置
    SAP财务供应链与金库管理的联系与区别
    评点SAP HR功能及人力资源管理软件
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4843416.html
Copyright © 2011-2022 走看看