`
wshyj18
  • 浏览: 166616 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

oracle树型结构查询

 
阅读更多

一般树形结构,我们是id,parentid,name 目前无法得到name 的 层级结构,只能写复杂语句2次查询得到,

例如我们可以拿到  0-10-11 而无法直接拿到  中国-黑龙经-哈尔滨 甚为苦恼,

SYS_CONNECT_BY_PATH

 

SYS_CONNECT_BY_PATH 和几个伪列CONNECT_BY_ROOT,CONNECT_BY_LEAF,CONNECT_BY_ISCYCLE

SYS_CONNECT_BY_PATH 函数

自从Since Oracle 9i 开始,就可以通过 SYS_CONNECT_BY_PATH 函数实现将从父节点到当前行内容以“path”或者层次元素列表的形式显示出来。 如下例所示:
column path format a50
select level,sys_connect_by_path(child,"/") path
from hier
start with parent is null
connect by prior child = parent;

LEVEL PATH 
-------- --------------------------------------------
1 /Asia
2 /Asia/China
3 /Asia/China/Beijing
2 /Asia/Japan
3 /Asia/Japan/Osaka
3 /Asia/Japan/Tokyo
1 /Australia
2 /Australia/New South Wales
3 /Australia/New South Wales/Sydney
1 /Europe
2 /Europe/United Kingdom
3 /Europe/United Kingdom/England
4 /Europe/United Kingdom/England/London
1 /North America
2 /North America/Canada
3 /North America/Canada/Ontario
4 /North America/Canada/Ontario/Ottawa
4 /North America/Canada/Ontario/Toronto
2 /North America/USA
3 /North America/USA/California
4 /North America/USA/California/Redwood Shores

在 Oracle 10g 中,还有其他更多关于层次查询的新特性 。例如,有的时候用户更关心的是每个层次分支中等级最低的内容。那么你就可以利用伪列函数CONNECT_BY_ISLEAF来判断当前行是不是叶子。如 果是叶子就会在伪列中显示“1”,如果不是叶子而是一个分支(例如当前内容是其他行的父亲)就显示“0”。下给出了一个关于这个函数使用的例子:

select connect_by_isleaf,sys_connect_by_path(child,"/") path
from hier
start with parent is null
connect by prior child = parent;

CONNECT_BY_ISLEAF PATH
---------------------------------- ------------
0 /Asia
0 /Asia/China
1 /Asia/China/Beijing
0 /Asia/Japan
1 /Asia/Japan/Osaka
1 /Asia/Japan/Tokyo
0 /Australia
0 /Australia/New South Wales
1 /Australia/New South Wales/Sydney
0 /Europe
0 /Europe/United Kingdom
0 /Europe/United Kingdom/England
1 /Europe/United Kingdom/England/London
0 /North America
0 /North America/Canada
0 /North America/Canada/Ontario
1 /North America/Canada/Ontario/Ottawa
1 /North America/Canada/Ontario/Toronto
0 /North America/USA
0 /North America/USA/California
1 /North America/USA/California/Redwood Shores

 

在Oracle 10g 中还有一个新操作——CONNECT_BY_ROOT。 它用在列名之前用于返回当前层的根节点。如下面的例子,我可以显示出层次结构表中当前行数据所对应的最高等级节点的内容。

select connect_by_root child,sys_connect_by_path(child,"/") path
from hier
start with parent is null
connect by prior child = parent;

CONNECT_BY_ROOT PATH
------------------------------ -------- 
Asia /Asia
Asia /Asia/China
Asia /Asia/China/Beijing
Asia /Asia/Japan
Asia /Asia/Japan/Osaka
Asia /Asia/Japan/Tokyo
Australia /Australia
Australia /Australia/New South Wales
Australia /Australia/New South Wales/Sydney
Europe /Europe
Europe /Europe/United Kingdom
Europe /Europe/United Kingdom/England
Europe /Europe/United Kingdom/England/London
North America /North America
North America /North America/Canada
North America /North America/Canada/Ontario
North America /North America/Canada/Ontario/Ottawa
North America /North America/Canada/Ontario/Toronto
North America /North America/USA
North America /North America/USA/California
North America /North America/USA/California/Redwood Shores

在Oracle 10g 之前的版本中,如果在你的树中出现了环状循环(如一个孩子节点引用一个父亲节点),Oracle 就会报出一个错误提示:“ ORA-01436: CONNECT BY loop in user data”。如果不删掉对父亲的引用就无法执行查询操作。而在 Oracle 10g 中,只要指定“NOCYCLE”就可以进行任意的查询操作。与这个关键字相关的还有一个伪列——CONNECT_BY_ISCYCLE, 如果在当前行中引用了某个父亲节点的内容并在树中出现了循环,那么该行的伪列中就会显示“1”,否则就显示“0”。如下例所示:

create table hier2
(
parent number,
child number
);

insert into hier2 values(null,1);
insert into hier2 values(1,2);
insert into hier2 values(2,3);
insert into hier2 values(3,1);

select connect_by_iscycle,sys_connect_by_path(child,"/") path
from hier2
start with parent is null
connect by nocycle prior child = parent;

CONNECT_BY_ISCYCLE PATH
------------------ -------
0 /1
0 /1/2
1 /1/2/3

分类: Oracle
分享到:
评论

相关推荐

    Oracle递归树形结构查询功能

    在Oracle中,树形结构查询的基本语法如下: ```sql SELECT [LEVEL], * FROM table_name START WITH 条件1 CONNECT BY PRIOR 条件2 WHERE 条件3 ORDER BY 排序字段 ``` - `LEVEL`:这是一个伪列,用于表示树的层级...

    oracle 树型的寻父或寻子

    本篇主要探讨如何在Oracle中进行树型结构的寻父或寻子操作,这涉及到一系列的查询技巧和数据库设计策略。 首先,我们通常使用递归查询来处理树型结构。Oracle提供了CONNECT BY子句,它允许我们在一个查询中多次引用...

    oracle 基于 树结构查询

    Oracle 基于树结构查询是一种高效的查询方式,特别在处理树型结构数据时。树结构查询可以快速地检索树型结构数据,并且可以根据实际需求进行查询优化。 树结构查询的基本概念: 树结构查询的基本概念是树结构数据...

    Delphi中数据库关联树型结构生成与同步数据维护.zip_数据同步_数据库关联_数据维护_树型结构生成

    在Delphi编程环境中,数据库关联树型结构的生成与同步数据维护是开发高效数据库应用程序的重要环节。本资料主要探讨了如何在Windows XP操作系统下,利用Delphi 7进行相关操作。 首先,我们要理解数据库关联的概念。...

    【原创】oracle树形结构查询,层次查询,hierarical retrival

    Oracle树形结构查询,层次查询,hierarchical retrieval Oracle中的树形结构查询,也被称为层次查询或hierarchical retrieval,是一种获取树形结构数据的方法。这种方法可以将数据组织成树形结构,具有层次关系的...

    Oracle 数据库树形结构用法总结.mht

    Oracle 数据库树形结构用法总结,例如SYS_CONNECT_BY_PATH 、START WITH . . . CONNECT BY . . .等具体语法介绍

    关于java树型结构

    在IT领域,特别是Java编程中,树型结构是一种非常重要的数据结构。它模拟了自然界中的树状模型,其中每个节点可以有零个或多个子节点,而根节点没有父节点。这种非线性的数据结构在处理层次关系的问题时非常有用,如...

    ORACLE进行树型查询时过滤条件的位置对结果的影响

    在Oracle数据库中,进行树型查询时,`START WITH` 和 `CONNECT BY PRIOR` 是两个关键的子句,它们用于构建层次结构的数据查询。这种查询模式常用于组织结构、文件系统、家族树等需要展示层级关系的数据。然而,如何...

    非定深度树与Oracle的等级查询.pdf

    总之,本文提供了一种在Oracle数据库中处理非定深度树型结构数据的有效策略,利用单表存储和等级查询,实现了数据操作的便捷性和存储空间的优化。这种方法对于需要处理具有不确定深度的树状数据的系统,尤其是数据库...

    用SQL形成父子结点树结构的妙法.pdf

    这种方法基于Oracle数据库,利用了SQL的强大功能,将传统的二维表通过特定的SQL查询语句转换成了一种易于理解和操作的树型结构。 这种方法的核心在于一个标志字段,本文中称之为“end”,它的作用是用来标识节点...

    基于Oracle的层次树查询功能及实例分析.pdf

    例如,营销公司作为根节点,下设财务部、市场部、销售部和人事部,销售部下又分为业务一部、业务二部、业务三部以及客户服务,业务一部又细分为南区和北区,形成一个典型的树型结构。 Oracle层次树查询的关键在于`...

    Oracle 树操作(SQL查询成树状菜单)

    #### 一、Oracle树型查询基础 Oracle数据库提供了强大的树型数据处理功能,特别是通过`SELECT ... START WITH ... CONNECT BY ... PRIOR`语法,可以方便地对表中的数据按照树状结构进行查询。这种查询方式非常适合...

    Oracle 实战SQL层次查询

    层次查询,也被称为树型结构查询,是在SQL中最常见的功能之一。这种查询方式主要用于处理具有层级结构的数据,例如组织架构、产品分类等场景。在Oracle数据库中,可以通过特定的语法实现层次查询。 层次查询主要...

    oracle prior

    Oracle Prior 知识点总结 Oracle 中的 Prior 子句是...Oracle 的 Prior 子句提供了一种灵活的方式来查询树状结构表中的数据,可以根据需要指定查询的顺序和范围,并且可以使用 WHERE 子句来限定树型结构中的单个节点。

    完整版数据库填充到树型框例程.rar

    常见的关系型数据库管理系统(RDBMS)如MySQL、Oracle、SQL Server等,使用表格形式来组织数据,便于数据操作和查询。 在用户界面设计中,树型框(Tree View)是一种常见的控件,用于显示层次结构的数据。它以节点...

    Excel树形结构数据导入Oracle数据库(Java)

    当我们面对大量结构化数据,例如Excel表格,需要将其导入到关系型数据库如Oracle时,通常会利用编程语言如Java来实现自动化处理。这篇博客“Excel树形结构数据导入Oracle数据库”提供了一个解决方案,下面将详细解析...

    jb+数据库+三级树型菜单

    3. **处理查询结果**:将查询结果转换为树型数据结构,如Node对象,这些对象可以作为JTree的模型。 4. **创建用户界面**:利用JavaFX或Swing库,创建JTree组件,并将之前构建的树型数据结构设置为其模型。 5. **...

    oracle数据库ppt中科院培训专用Lescn7PPT优秀资料.ppt

    本教程重点介绍了如何理解和应用Oracle数据库的分级查询,以帮助用户掌握在实际工作中创建树型结构报告和处理层次数据的方法。 首先,分级查询的概念是Oracle数据库中用于处理具有层级关系数据的关键工具。这种查询...

    高性能sql調整,適用oracle和系統開發人員學習

    本文将围绕如何优化Oracle数据库中的SQL查询,特别是针对树型结构表查询进行深入探讨。 树型结构表查询在组织层次结构数据时非常常见,如员工的上下级关系。在Oracle中,我们可以使用`CONNECT BY PRIOR`和`START ...

Global site tag (gtag.js) - Google Analytics