`
mwei
  • 浏览: 121947 次
  • 性别: Icon_minigender_1
  • 来自: 抽象空间
社区版块
存档分类
最新评论

oracle connect by level 应用

    博客分类:
  • db
阅读更多
关键字:oracle connect by level 树状结构表
定义如下id 和 名称描述
1— 省长 <--- 2,3 (省长管辖市长、县长)
2— 市长 <--- 5,6 (市长管辖模范村村长和一个平民)
3— 县长 <--- 4,7,8,9 (县长管辖镇长和三个平民)
4— 镇长 <--- 10,11,12,13 (管辖四个平民)
5— 村长 <--- 14,15 (管辖两个平民)
其他(6-15)— 平民(没有管辖任何人)

只有省长、市长县长能处理问题,那么每个人出了问题应该首先找谁来解决?
省长权利最大,自己出了问题自己解决,别人也没法知道; 可以认为在关系表里省长的父节点是自己。

create table person(id int primary key, description varchar2(50));
create table relationship(child int, parent int, primary key(child,parent));
insert into person values(1,‘省长’);
insert into person values(2,‘市长’);
insert into person values(3,‘县长’);
insert into person values(4,‘镇长’);
insert into person values(5,‘村长’);
insert into person values(6,‘平民’);
...//省略的都是平民
insert into person values(15,‘平民’);

insert into relationship values(1,1); //关系如下
insert into relationship values(2,1);
insert into relationship values(3,1);
insert into relationship values(5,2);
insert into relationship values(6,2);
insert into relationship values(4,3);
insert into relationship values(7,3);
insert into relationship values(8,3);
insert into relationship values(9,3);
insert into relationship values(10,4);
insert into relationship values(11,4);
insert into relationship values(12,4);
insert into relationship values(13,4);
insert into relationship values(14,5);
insert into relationship values(15,5);

查看一下关系树:
select rpad('---',(level-1)*3,'---')||child relation_tree
from relationship
start with child=parent
connect by nocycle prior child=parent; --结果如下
RELATION_TREE
------------------
1
---2
------5
---------14
---------15
------6
---3
------4
---------10
---------11
---------12
---------13
------7
------8
------9

已选择15行。

查看父子关系情况:
select child,parent
from relationship
start with child=parent
connect by nocycle prior child=parent
order by parent; --结果如下
 CHILD     PARENT
---------- ----------
         1          1
         2          1
         3          1
         5          2
         6          2
         4          3
         8          3
         7          3
         9          3
        11          4
        12          4
        10          4
        13          4
        14          5
        15          5

已选择15行。

下面要看一看:每个人有事时,首先找到谁来处理?不能每个人有事都找省长吧。
下面的sql使用了oracle家的两个变态函数:first_value & connect_by_root
select distinct child ,first_value(parent)over(partition by child order by lv) parent
from(
    select connect_by_root(r.child) child, p.description descr, level lv, r.parent
 	from person p ,relationship r
 	where p.id= r.parent
 	connect by nocycle prior r.parent=r.child
 )
where descr in('省长', '市长', '县长')
order by parent,child; --结果如下
     CHILD     PARENT
---------- ----------
         1          1
         2          1
         3          1
         5          2
         6          2
        14          2
        15          2
         4          3
         7          3
         8          3
         9          3
        10          3
        11          3
        12          3
        13          3

已选择15行。

这个sql到底行不行,再加条数据看看
insert into person values(333,‘县长’);
insert into person values(555,‘村长’);
insert into person values(666,‘平民’); 
insert into person values(777,‘平民’);

insert into relationship values(333,1);
insert into relationship values(555,333);
insert into relationship values(666, 555);
insert into relationship values(777,666);
              --666这个平民有¥,777愿意跟着他(这条记录比较特殊)

再使用上面的语句查看一下,结果如期所至。
给个DDL & DML文件,方便一下需要的童鞋。

分享到:
评论

相关推荐

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。  JARED STILL 从1994年就开始使用...

    Oracle SQL实用讲解,最基本最实用的相关讲解

    (SELECT LEVEL AS lv FROM dual CONNECT BY LEVEL ), t_join AS (SELECT a.lv lv_a, b.lv lv_b, to_char(b.lv) || 'X' || to_char(a.lv) || '=' || rpad(to_char(a.lv * b.lv), 2, ' ') AS text FROM t_base a...

    Oracle数据行拆分多行方法示例

    connect by level &lt;= regexp_count('444.555.666', '\.') + 1 输出结果: COL ---- 444 555 666 多行拆分 如果数据表存在多行数据需要拆分,也可以在原表上使用connect+正则的方法: 方法一

    Oracle中查询本月星期5的所有日期列表的语句

    代码如下: SELECT * FROM (SELECT TRUNC(SYSDATE, ‘mm’) + ROWNUM – 1 DAYS FROM (SELECT LEVEL FROM DUAL CONNECT BY LEVEL &lt;= TRUNC(LAST_DAY(SYSDATE)) – TRUNC(SYSDATE, ‘mm’) + 1)) WHERE TO_CHAR...

    oracle将以逗号分隔字符串转多行

    不做详解,直接上图。 SELECT T.NAME, T.TESTSTR FROM TEST2 T;   ... CONNECT BY LEVEL &lt;= (LENGTH(T.TESTSTR) - LENGTH(REPLACE(T.TESTSTR, ',', '')) + 1); -- Create table TEST2 create

    Oracle 数据库特殊查询总结

    1. 查询本节点及本节点以下的所有节点: ...SELECT RPAD( ' ', 2*(LEVEL-1), '-' ) || DEPNAME "DEPNAME",CONNECT_BY_ROOT DEPNAME "ROOT",CONNECT_BY_ISLEAF "ISLEAF",LEVEL ,SYS_CONNECT_BY_PATH(DEPNAM

    Oracle字段根据逗号分割查询数据的方法

    需求是表里的某个字段存储的值是以逗号分隔开来的,要求根据分隔的每一个值都能查出来数据,但是不能... connect by level &lt;= regexp_count(st_responsible, ‘,‘) + 1 and guid = prior guid and prior dbms_ra

    Oracle事例

    create public database link dblink1 connect to db1 identified by \"123*456\" using \'db11\' 20.oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。 下面的语句可以进行总计 select ...

    merge_row_count:一个简单的实用程序,允许对由 Oracle 中的合并操作插入更新删除的行进行计数

    合并行数 一个简单的实用程序 PL/SQL 包,允许对 Oracle 中的合并操作插入/更新/删除的行进行计数。 包的需要 Oracle不提供获取行数的功能。 插入 更新 已删除 ... CONNECT BY LEVEL &lt;= 50 ; C

    oracle 树查询 语句

    格式: SELECT column FROM table_name START WITH column=value CONNECT BY PRIOR 父主键=子外键 select lpad(‘ ‘,4*(level-1))||name name,job,id,super from emp start with super is null connect by prior id...

    Oracle SQL树形结构查询

    本文介绍Oracle中使用START WITH...CONNECT BY PRIOR子句实现递归查询树形结构的方法,小伙伴们可以参考一下。

    oracle 使用递归的性能提示测试对比

    当你用start with connect by nocycle prior 进行递归查找数据的时候那么下面两段代码的性能肯定是有明显差别的大家用的时候 请注意了代码可以不看下面 直接看我的总结 //查询某个文件夹文件夹ID=12里面的层次数以及...

    orcale常用命令

    要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle&gt;sqlplus SQL&gt;connect internal SQL&gt;startup SQL&gt;quit b、关闭ORACLE系统 oracle&gt;sqlplus SQL&gt;connect internal ...

    ora分析脚本

    -i instance# append # to ORACLE_SID -sid &lt;sid&gt; set ORACLE_SID to sid -top # limit some large queries to on # rows - repeat &lt;interval&gt; |forever&gt; Repeat an coomand &lt;count&gt; time. Sleep &lt;interval&gt; ...

    SQL性能优化

    CONNECT BY PRIOR ID = parent_id AND STATEMENT_ID = user_define  示例 如要测试下面SQL: SELECT c.short, a.cday, a.card_no, a.qty FROM sales.stockiohis a, sales.product_info b, sales.vendor c WHERE ...

    精髓Oralcle讲课笔记

    -- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unlock; --那么这个用户名就能使用了。 --(默认全局数据库名orcl) 1、...

    php.ini-development

    An empty string can be denoted by simply not writing anything after the equal ; sign, or by using the None keyword: ; foo = ; sets foo to an empty string ; foo = None ; sets foo to an empty string ;...

Global site tag (gtag.js) - Google Analytics