大致写法:select * from some_table [where 条件1] connect by [条件2] start with [条件3];其中 connect by 与 start with 语句摆放的先后顺序不影响查询的结果,[where 条件1]可以不需要。

另外一种写法:select * from some_table connect by [条件2][条件1]start with [条件3][条件1];

[where 条件1]、[条件2]、[条件3]各自作用的范围都不相同:

[where 条件1]是在根据“connect by [条件2] start with [条件3]”选择出来的记录中进行过滤,是针对单条记录的过滤, 不会考虑树的结构;

[条件2]指定构造树的条件,以及对树分支的过滤条件,在这里执行的过滤会把符合条件的记录及其下的所有子节点都过滤掉;

[条件3]限定作为搜索起始点的条件,如果是自上而下的搜索则是限定作为根节点的条件,如果是自下而上的搜索则是限定作为叶子节点的条件;

示例:

假如有如下结构的表:some_table(id,p_id,name),其中p_id保存父记录的id。

select * from some_table t where t.id!=123 connect by prior t.p_id=t.id and t.p_id!=321 start with t.p_id=33 or t.p_id=66;

对prior的说明:

prior存在于[条件2]中,可以不要,不要的时候只能查找到符合“start with [条件3]”的记录,不会在寻找这些记录的子节点。要的时候有两种写法:connect by prior t.p_id=t.id或connect by t.p_id=prior t.id,前一种写法表示采用自上而下的搜索方式(先找父节点然后找子节点),后一种写法表示采用自下而上的搜索方式(先找叶子节点然后找父节点)。

自从Oracle 9i开始,可以通过 SYS_CONNECT_BY_PATH 函数实现将父节点到当前行内容以“path”或者层次元素列表的形式显示出来。

自从Oracle 10g 中,还有其他更多关于层次查询的新特性 。例如,有的时候用户更关心的是每个层次分支中等级最低的内容。

那么你就可以利用伪列函数CONNECT_BY_ISLEAF来判断当前行是不是叶子。如果是叶子就会在伪列中显示“1”,

如果不是叶子而是一个分支(例如当前内容是其他行的父亲)就显示“0”。

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

--oracle 9i

sys_connect_by_path

With sys_connect_by_path it is possible to show the entire path from the top level down to the 'actual' child.

--oracle 10g

connect_by_root

connect_by_root is a new operator that comes with Oracle 10g and enhances the ability to perform. hierarchical queries.

connect_by_is_leaf

connect_by_isleaf is a new operator that comes with Oracle 10g and enhances the ability to perform. hierarchical queries.

connect_by_iscycle

connect_by_is_cycle is a new operator that comes with Oracle 10g and enhances the ability to perform. hierarchical queries.

--创建测试表,增加测试数据

create table test(superid varchar2(20),id varchar2(20));

insert into test values('0','1');

insert into test values('0','2');

insert into test values('1','11');

insert into test values('1','12');

insert into test values('2','21');

insert into test values('2','22');

insert into test values('11','111');

insert into test values('11','112');

insert into test values('12','121');

insert into test values('12','122');

insert into test values('21','211');

insert into test values('21','212');

insert into test values('22','221');

insert into test values('22','222');

commit;

--层次查询示例

select level||'层',lpad(' ',level*5)||id id

from test

start with superid = '0' connect by prior id=superid;

select level||'层',connect_by_isleaf,lpad(' ',level*5)||id id

from test

start with superid = '0' connect by prior id=superid;

--给出两个以前在"数据库字符串分组相加之四"中的例子来理解start with ... connect by ...

--功能:实现按照superid分组,把id用";"连接起来

--实现:以下两个例子都是通过构造2个伪列来实现connect by连接的。

/*------method one------*/

select superid,ltrim(max(sys_connect_by_path(id,';')),';') from(

select superid,id,row_number() over(partition by superid order by superid) id1,

row_number() over(order by superid) + dense_rank() over(order by superid) id2

from test

)

start with id1=1 connect by prior id2 = id2 -1

group by superid order by superid;

/*------method two------*/

select distinct superid,ltrim(first_value(id) over(partition by superid order by l desc),';')

from(

select superid,level l,sys_connect_by_path(id,';') id

from(

select superid,id,superid||rownum parent_rn,superid||to_char(rownum-1) rn

from test

)

connect by prior parent_rn = rn

);

--下面的例子实现把一个整数的各个位上的数字相加,通过这个例子我们再次理解connect by.

create or replace function f_digit_add(innum integer) return number

is

outnum integer;

begin

if innum<0 then

return 0;

end if;

select sum(nm) into outnum from(

select substr(innum,rownum,1) nm from dual connect by rownum);

return outnum;

end f_digit_add;

/

select f_digit_add(123456) from dual;

oracle中 start with,Oracle中connect by...start with...的使用相关推荐

  1. mysql 类似 oracle connect by,mysql中实现相仿oracle的SYS_CONNECT_BY_PATH功能

    mysql中实现类似oracle的SYS_CONNECT_BY_PATH功能 oracle中的SYS_CONNECT_BY_PATH函数为开发带来了便利,mysql中如何实现类的功能呢? DELIMI ...

  2. oracle停止一切进程,oracle启动/停止的几种方法以及 启动和停止过程中出错的解决办法...

    一.启动几种方法: 1. sqlplus /nolog connect /as sysdba startup 2. sqlplus /nolog connect /as sysdba startup ...

  3. oracle 正则表达式拆分字符串,oracle中通过正则表达式函数处理逗号分隔的字段...

    这个题目的确不大好写,其实际含义基于一个场景: 比如在oracle的某张表中,有两个字段 A1          B1 1         A,B,C,D, 2         E,F 假如现在的需求 ...

  4. Python中操作MySQL/Oracle

    Python中操作MySQL/Oracle 一.Python操作数据库介绍 二.Python操作MySQL 2.1 PySQL模块 2.1.1 安装PyMySQL 2.2 基本使用 2.3 获取最新创 ...

  5. oracle故障一例,工作中遇到的oracle故障分析和处理一例

    工作中遇到的oracle故障分析和处理一例以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 案例类别 VAS网络 系统类型 ...

  6. python连接oracle报错dpi 1047_python连接Oracle的方式以及过程中遇到的问题

    一.库连接步骤 1.下载cx_Oracle模块 下载步骤 工具 pycharm :File--->右键setting--->找到Project Interpreter  -----> ...

  7. oracle 导入电子表格,oracle数据导入到电子表格中

    oracle数据导入到excel中 实现步骤: 1.连入SQL*Plus 以system/manager用户登录, SQL> conn system/manager 创建新的用户:如user1/ ...

  8. oracle remap语句格式,impdp 中的remap方式

    impdp 中的remap方式 impdp 中要是没有remap方式,那么个人认为datapump 将是一个死板的工具. remap_table方式 语法格式:REMAP_TABLE=[schema. ...

  9. Oracle在命令行中输入clear,Oracle SQLPlus 常用命令及解释

    Oracle SQLPlus 常用命令及解释 1.@ 执行位于指定脚本中的SQLPlus语句.可以从本地文件系统或Web服务器中调用脚本.可以为脚本中的变量传递值.在iSQL*Plus中只能从Web服 ...

  10. su oracle 登录不了,Oracle中su切换进去sqlplus登录失败的问题处理

    问题描述: 生产环境的Oracle数据库突然登录不上去了,rlwrap生产环境的oracle数据库突然登录不上去了,rlwrap sqlplus "/ as sysdba"报错如下 ...

最新文章

  1. java string 连续字符_Java中字符串中连续相同字符去重方法
  2. 虚幻四如何实现第一人称_虚幻周报20200930 | 双节快乐么么哒!
  3. Spark笔记:复杂RDD的API的理解(下)
  4. 中科院召开嫦娥四号任务动员会
  5. 在无头单链表的一个非头节点前插入一个节点(C语言)
  6. android彻底关闭应用程序方法
  7. 50 FI配置-财务会计-固定资产-与总账集成-定义集成资产购置的技术清算科目
  8. html 中写注释吗,html怎么注释?
  9. 管理科学の学生自学CS的【计划】与【心得】
  10. 【zk开发】让eclipse识别×.zul文件为xml格式
  11. VTM3.0代码阅读:xCheckRDCostMerge2Nx2N函数
  12. 厉害!一年两登顶刊的31岁浙大硕导荣获杰青!
  13. w ndows10更新后变成32位了,三种直接从 Win7 升级到 Win10 的方法
  14. 理解设计模式——代理模式
  15. 【光通信】布线时,什么情况用单模光纤,什么情况用多模光纤
  16. NOIP2012 国王游戏(贪心)
  17. 儿童智能手环方案/案列/APP/小程序/网站
  18. 建议收藏!仓库规划与布局设计整体方案
  19. linux自动关机取消命令,Linux中Shutdown命令实现定时自动关机
  20. centos安装mysql_centos如何安装mysql

热门文章

  1. 【转】MyEclipse快捷键大全
  2. linux扫描工具之nmap
  3. ProFTPD 初探
  4. Javascript 仿Flash 图片切换 及 Flash 图片切换
  5. python2.7是什么_python2.7是什么
  6. mysql全文索引thinkphp_ThinkPHP5 使用迅搜 (XunSearch) 实现全文检索实例指导
  7. c语言源程序最多可能由组成,一个C语言源程序由若干函数组成,其中至少应含有一个()。...
  8. [转载] Java中的final变量、final方法和final类
  9. JavaScript | 声明数组并使用数组索引分配元素的代码
  10. laravel 项目迁移_在Laravel迁移