`

oracle中使用sys_connect_by_path进行表中行值连接

阅读更多

一、最原始的表说明

CREATE TABLE DATADIC
(
  DATAID       NUMBER                           NOT NULL,
  NAME         VARCHAR2(100 BYTE),
  VALUE        VARCHAR2(100 BYTE),
  PARENTID     NUMBER,
  SEQUENCE     NUMBER,
  DESCRIPTION  VARCHAR2(1000 BYTE)
)

 

 datadic 是一张树状的数据字典表,dataId:主键  value:对应的值  parentId:父节点的主键

 使用select * from datadic 查询完数据对应的值如下:

 约定:根的id为0,可以看到根下面有两条记录,分别行业数据,政务数据。

版次及其他版本形式下面有九个子节点,也就是九条根据,分别为3版、1 版、2版……增订本、2版(修订本)

要实现的最终效果是:

   parentID(父节点id)     parentValue(父节点值)    childvalue(子节点值)

        0                                    根                         行业数据*政务数据

      ……                                 ……                        ……

        140                             版次及其他版本形式    3版*1 版*2版……增订本*2版(修订本)

二、取按照parentid分组,组内部按照dataid排序后的行号

select  t.parentid, 
                t.value, 
                t.dataid,
                (row_number()  /* 按照parentid分组,组内部按照dataid排序后的行号*/
                 over(partition by parentid order by dataid)
                ) numid 
           from datadic t

查询后的记录集如下:

这个记录表示,parentId为0的记录有6条,numid就是按照parentId分组后按照dataid排序后的rownum.

 

 重点函数:row_number()   over(partition by 分组列 order by 排序列)

还有相关的函数:

      rank() over(partition by 分组列 order by 排序列)   :和名次一样,并列2个之后是第三名

      densrank() over(partition by 分组列 order by 排序列)   :连续顺序,有2个第二名,仍然跟前第三名。

三、按照上面的行号进行轮循,进行组内每行字符串的连接。

select parentid, parentValue,
        ltrim(sys_connect_by_path(value, '*'), '*') valuues 
   from (select t.parentid, 
                   t.value, 
	   t.dataid,
	   parent.VALUE as  parentValue,
                   (row_number()  /* 按照parentid分组,组内部按照dataid排序后的行号*/
                      over(partition by t.parentid order by t.dataid)
                    ) numid 
           from bap_datadic t,bap_datadic parent
           where t.PARENTID=parent.DATAID
   ) 
   WHERE connect_by_isleaf = 1 
   start with numid = 1 
   connect by numid - 1 = prior numid    and parentid = prior parentid; 

 查询结果如下,可以看到显示父节点id、父节点值、父节点下所有子节点的值。

 

重点函数:sys_connect_by_path(value, '*')

     value表示要连接的字段,‘*’表示连接符。

    使用这个方法之前必须在where条件中构建树

    where start with 条件1  connect by prior 条件2

   条件1 :表示起始条件,例如,起始条件为组内排序后的rownum为1。

   条件2 :表示要连接的下一行与上一行的关系,例如上面第一记录,valuues  对应的值是:“出版行业*版权行业”。那么“版权行业”与“出版行业”之间的关系是:相同的parentId中的numid+1,所以其条件为:

        start with numid = 1
       connect by numid - 1 = prior numid    and parentid = prior parentid;

其中,prior.列名:代表上一行的列。

 

SYS_CONNECT_BY_PATH :实现将从父节点到当前行内容以“path”或者层次元素列表的形式显示出来

 

CONNECT_BY_ROOT: 它用在列名之前用于返回当前层的根节点

 

connect_by_isleaf:来判断当前行是不是叶子。如 果是叶子就会在伪列中显示“1”,如果不是叶子而是一个分支(例如当前内容是其他行的父亲)就显示“0”。

 

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

 

 

  select temp.CASE_ID,ltrim(max(sys_connect_by_path(temp.name,'//')),'//')
  from 
  (   select asso.CASE_ID as CASE_ID,
             subject.NAME as name,
            (row_number()  over(partition by asso.CASE_ID order by asso.ID)  ) numid                       
      from IPMS_SUBJECT_CASE_ASSO asso,IPMS_SUBJECT subject
      where  asso.SUBJECT_ID=subject.ID  
  )temp
  start with temp.numid=1
  connect by temp.CASE_ID=prior temp.CASE_ID
  and temp.numid-1=prior temp.numid
  group by temp.CASE_ID

 

  • 大小: 8.3 KB
  • 大小: 4.7 KB
  • 大小: 13.6 KB
分享到:
评论
3 楼 xunmengsj 2014-04-08  
很好很强大,写的也很明白,解决了我的问题。
2 楼 poing 2012-04-13  
不错。。。解决了我刚遇到的问题。。。。没看太懂。。收藏留着以后搞懂
1 楼 wmcoo 2011-10-18  
原创不,转了

相关推荐

    sys_connect_by_path的用法20220526.txt

    行列转换,层级关系,oracle sys_connect_by_path的用法

    ORACLE中的sys_context函数

    Oracle 中的 sys_context 函数 sys_context 函数是 Oracle 提供的一个获取环境上下文信息的预定义函数。该函数用来返回一个指定 namespace 下的 parameter 值。该函数可以在 SQL 和 PL/SQL 语言中使用。 sys_...

    oracle sys_connect_by_path 函数 结果集连接

    Oracle的`sys_connect_by_path`函数是一个非常有用的工具,尤其在构建树状结构的数据时。在本文中,我们将深入理解这个函数以及如何将其应用于非树结构的数据以生成所需的结果。 `sys_connect_by_path`函数的基本...

    connect_by_path和connect_by_root比较总结

    通过实例比较了 SYS_CONNECT_BY_PATH 和 CONNECT_BY_ROOT 的异同,和返回树形的数据结构

    Oracle9.2_SYS_CONTEXT函数的用法

    ### Oracle9.2_SYS_CONTEXT函数详解 在Oracle数据库系统中,`SYS_CONTEXT`函数...在Oracle9.2及后续版本中,熟练掌握`SYS_CONTEXT`函数的使用方法对于任何希望充分利用Oracle数据库强大功能的用户来说都是至关重要的。

    Oracle的LOB(CLOB)大字段以及(SYS_LOB$$)清理.txt

    Oracle的LOB(CLOB)大字段以及(SYS_LOB$$)清理.txt

    ORACLE查询树型关系(connect_by_prior_start_with)

    使用 START WITH 和 CONNECT BY 子句可以实现 SQL 的层次查询,并且可以使用 SYS_CONNECT_BY_PATH 函数和 CONNECT_BY_ROOT、CONNECT_BY_ISLEAF、CONNECT_BY_ISCYCLE 等伪列函数来增强层次查询的能力。

    Oracle中的USERENV和SYS_CONTEXT范例

    "Oracle中的USERENV和SYS_CONTEXT范例" Oracle中的USERENV和SYS_CONTEXT是两个非常重要的函数,它们都可以用于获取当前会话的信息,例如当前用户、当前实例、当前语言等。 USERENV函数 USERENV函数用于返回当前...

    ORACLE SYS.DBMS_REGISTRY_SYS has errors

    标题中的问题“ORACLE SYS.DBMS_REGISTRY_SYS has errors”指的是在Oracle数据库系统中,系统包BODY `SYS.DBMS_REGISTRY_SYS` 出现错误,导致了一系列的PL/SQL调用失败。这种错误通常与数据库的元数据注册功能有关,...

    cx_Oracle-7.3.0_oracle_cx_oracle_cx_Oracle7.3对应_python_jupyteror

    标题中的"cx_Oracle-7.3.0_oracle_cx_oracle_cx_Oracle7.3对应_python_jupyteror" 提到了一个关键的Python库——cx_Oracle,它是Python与Oracle数据库之间的一个接口,允许Python程序员使用Oracle的全部功能。...

    oracle connect by level 应用

    在这个例子中,`SYS_CONNECT_BY_PATH`函数用斜杠(/)分隔了路径中的每一个员工名。 需要注意的是,`CONNECT BY`可能会导致循环引用或无限循环,如果数据存在环状引用(员工A的上级是员工B,而员工B的上级又回到了...

    oracle开启audit(审计)

    本文将深入探讨如何在Oracle环境中配置和使用Audit功能,包括必要的步骤、参数调整以及实战示例。 #### 配置Audit环境 首先,确保Oracle数据库已经正确安装和运行,并且拥有足够的权限进行参数设置。以下是在...

    java-connect-oracle.zip_java 连接oracle_oracle_oracle connect java

    在Java编程中,连接Oracle数据库是一项基础且重要的任务。Oracle数据库是全球广泛使用的数据库管理系统,而Java作为一种跨平台的编程语言,提供了丰富的API来与各种数据库进行交互,其中包括Oracle数据库。本篇将...

    Oracle_审计表_sys.aud$_授权给用户Truncate权限.docx

    为了确保系统的稳定运行和数据的安全性,有时需要对`SYS.AUD$`表进行清理或截断。本文档将详细介绍如何为特定用户授予截断`SYS.AUD$`表的权限,并提供一系列与之相关的Oracle数据库管理和优化操作。 #### 关键知识...

    Oracle的Connect By使用示例

    ### Oracle的Connect By...此外,结合其他函数(如`LPAD`和`SYS_CONNECT_BY_PATH`)使用,可以让查询结果更加直观易懂。这对于开发人员来说是一项非常有用的技能,特别是在处理复杂的组织结构或者产品分类等场景时。

    oracleConnect.zip_OracleConnect_delphi oracle_odac_odac delphi_

    OracleConnect.zip_OracleConnect_delphi oracle_odac_odac delphi_这个压缩包文件主要涉及在Delphi开发环境中,利用ODAC(Oracle Data Access Components)控件来实现与Oracle数据库的连接,而无需安装完整的Oracle...

    oracle列合并的实现方法

    很多场合我们都会用到...sys_connect_by_path(字段名, 2个字段之间的连接符号),这里的连接符号不要使用逗号,oracle会报错,如果一定要用,可以使用replace替换一下,方法如下 REPLACE(字段名,原字符,’,’)。这个

    cx_Oracle使用手册

    cx_Oracle是Python编程语言中用于连接Oracle数据库的一个模块。该模块遵循Python数据库API规范,并且适用于Oracle 11.2和12.1版本,同时兼容Python 2.x和3.x版本。cx_Oracle模块通过使用Oracle客户端库来实现与...

    Oracle_start_with_connect_by_prior_用法[文].pdf

    Oracle 连接查询是指使用 START WITH 和 CONNECT BY 语句来实现递归查询的方法,这种方法可以生成树形结构的数据。在 Oracle 中,START WITH 语句用于指定递归查询的开始记录,而 CONNECT BY 语句用于指定递归查询的...

Global site tag (gtag.js) - Google Analytics