`
mwei
  • 浏览: 124234 次
  • 性别: 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的Connect By使用示例

    ### Oracle的Connect By使用示例 #### 一、引言 在关系数据库系统中,进行树状或层次结构数据查询时经常会遇到复杂性问题。Oracle数据库通过提供`START WITH...CONNECT BY`语句来简化这类查询操作。此功能最早出现...

    connect by的使用探索

    Connect By语句的应用场景非常广泛,例如: 1. 人力资源管理系统:Connect By语句可以用于查询员工的上下级关系。 2. 文件系统管理:Connect By语句可以用于查询文件系统的目录树形结构。 3. Social Network 分析:...

    ORACLE查询树型关系(connect_by_prior_start_with)

    ORACLE 查询树型关系(connect_by_prior_start_with) Oracle 查询树型关系是指使用 START WITH 和 CONNECT BY 子句来实现 SQL 的层次查询。从 Oracle 9i 开始,可以通过 SYS_CONNECT_BY_PATH 函数实现将父节点到...

    浅谈Oracle下connect by原理.pdf

    文章中给出了一个名为`t_test_connectby`的数据表例子,其中包含父子关系的节点数据。通过该表,我们可以更直观地了解Connect By的执行过程。 - 不指定起始条件时,使用`CONNECT BY`: ```sql SELECT * FROM t_test...

    connect_by_prior_递归算法

    ### Oracle中的Connect By Prior递归算法详解 #### 一、Connect By Prior 子句概述 在Oracle数据库中,`Connect By Prior`子句是一种非常有用的工具,尤其在处理具有层次结构的数据时。它允许用户以一种简洁的方式...

    Oracle start with.connect by prior子句实现递归查询

    ### Oracle Start With.Connect By Prior 子句实现递归查询 #### 概述 在Oracle数据库中,`Start With.Connect By Prior`子句是执行递归查询的一种强大工具,主要用于处理层次结构数据。这类数据通常存在于组织...

    oracle数据库startwith用法

    通过本文,我们详细介绍了Oracle数据库中 `START WITH` 和 `CONNECT BY` 的使用方法以及应用场景。这两个关键字对于处理具有层级结构的数据非常有用。此外,我们还讨论了如何利用 `LEVEL` 关键字来显示节点所在的...

    oracle中connect-by-prior用法,实战解决日期分解问题.docx

    总的来说,`CONNECT BY PRIOR`是Oracle SQL中处理树形数据结构的强大工具,它能够帮助我们有效地查询和呈现层级关系,广泛应用于组织架构、产品分类、供应链管理等各种场景。正确理解和使用这个功能,可以极大地提升...

    connect by prior数据库树的应用

    ### Connect By Prior 数据库树的应用 #### 概述 在关系型数据库中,尤其是在 Oracle 数据库环境下,构建和查询层次结构数据是一项常见的需求。通过使用 `Connect By Prior` 存储过程,我们可以有效地处理这类问题...

    connect by的使用

    在Oracle数据库中,`CONNECT BY` 是一个非常重要的SQL语法,用于构建层次查询,它能够帮助我们处理具有层级关系的数据,比如组织结构、产品分类、树形菜单等。`CONNECT BY` 查询允许从一个表中抽取数据,并按照指定...

    树状数据库表:Oracle中start with...connect by prior子句用法

    Oracle在`CONNECT BY`查询过程中自动提供了一个`LEVEL`伪列,它表示当前行在树结构中的深度,从1开始计数。这个信息可以用于过滤或在结果集中显示层级。 5. **示例**: 假设有一个`DEPARTMENTS`表,包含`...

    Oracle递归树形结构查询功能

    Oracle数据库在处理树形结构数据时提供了强大的递归查询功能,这种特性对于组织结构、产品分类、层级菜单等场景的应用非常广泛。递归树形结构查询主要依赖于`CONNECT BY`和`PRIOR`关键字,它们允许我们构建复杂的...

    oracle中connect-by-prior用法,实战解决日期分解问题.pdf

    `LEVEL`伪列是`connect by prior`查询中的一个重要部分,它可以记录当前行在树结构中的深度,根节点的`LEVEL`始终为1,子节点的`LEVEL`递增。 此外,`WHERE`子句可以用来剪裁树结构,比如移除不满足特定条件的节点...

    将 CONNECT BY 移植到 DB2

    Oracle 使用 `CONNECT BY` 子句以及 `LEVEL`, `PRIOR`, `CONNECT_BY_ROOT` 等伪列来实现递归查询。相比之下,DB2 使用递归 CTE 和 `UNION ALL` 来实现相同的功能。 #### 动机 在将应用从 Oracle 迁移到 DB2 的过程...

    Oracle_hierarchical_SQL_查询应用

    自Oracle 9i版本开始,`SYS_CONNECT_BY_PATH`函数被引入,用于追踪从根节点到当前行的完整路径。在SQL1.3中,这个函数将每个地区的完整路径以斜线分隔的形式返回。例如,路径`/Asia/China/Beijing`表示从亚洲开始,...

    Oracle 12c r2优化参数设置.docx

    1. **_allow_level_without_connect_by**: 这个参数允许在不使用CONNECT BY的情况下执行层次查询,可以提高某些特定查询的性能。 2. **memory_max_target** 和 **memory_target**: 这两个参数用于控制数据库的整体...

    ORACLE速成手册 面向应用

    - **LEVEL**:在WITH RECURSIVE或CONNECT BY子句中使用,表示递归层次。 #### 3. Oracle函数 Oracle提供了丰富的内置函数,用于进行各种计算和转换。常见的函数包括: - **字符串函数**:如UPPER、LOWER、TRIM等...

    oracle-tree-sql.rar_oracle

    Oracle提供了一种称为“连接查询”(Connect By)的特有语法,使得我们可以方便地对具有层级关系的数据进行检索。本资料"oracle-tree-sql.rar_oracle"主要探讨的就是如何在Oracle中使用SQL查询树形结构数据。 一、...

    【Oracle】树状结构查询

    SELECT LEVEL, CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF, SYS_CONNECT_BY_PATH(a.ename, '/'), a.* FROM empa WHERE a.empno &lt;&gt; 7369 START WITH a.empno = 7839 CONNECT BY NOCYCLE PRIOR a.empno = a.mgr; ``` ...

Global site tag (gtag.js) - Google Analytics