oracle中 start with,Oracle中connect by...start with...的使用

大致写法: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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【第56题】【062题库】2019年OCP认证062考试新题

56题、choose two In your database, USERS is the default permanent tablespace. Examine the commands and their outcome: SQL> CREATE USER user02 identified by us123 QUOTA 10M ON users; User created. SQL> GRANT create session, sysdba TO user02; Grant suc…

python 共享文件夹 密码_用不同的用户名和密码登录网络上的共享文件夹

网络共享时,有时不同的文件夹需要不同的用户名和密码登入,而windows已经记录了一个原来使用的用户名及密码默认使用这个用户名及密码不再弹出用户名及密码输入提示对话框.简易解决办法.如下:1、注销当前用户重新登入。(重启亦可)2、单击开始菜单&#xff0c;在运行对话框(快捷键…

php 接口有几种,【后端开辟】php接口有哪些范例?

接口是什么&#xff1f;运用接口(interface)&#xff0c;能够指定某个类必需完成哪些要领&#xff0c;但不须要定义这些要领的具体内容。接口是经由过程 interface 关键字来定义的&#xff0c;就像定义一个规范的类一样&#xff0c;但个中定义一切的要领都是空的。接口中定义的…

python福利彩随机_看大神如何用Python分析福利彩票的秘密,百万大奖不是梦!

相信福利彩票大家都买过吧&#xff0c;既然学爬虫为何不动手写个小程序抓一下呢&#xff0c;说不定还能发现福彩的秘密&#xff0c;本篇主要面向于对Python爬虫感兴趣的零基础的同学&#xff0c;实例为中彩网的福利3D彩票&#xff0c;比较有趣&#xff0c;小伙伴们一起动手开始…

java是编译型语言还是解释型语言?

首先拿python和C说明&#xff0c;python运行速度慢&#xff0c;和C程序相比非常慢&#xff0c;因为Python是解释型语言&#xff0c;你的代码在执行时会一行一行地被python解释器翻译成CPU能理解的机器码&#xff0c;这个翻译过程非常耗时&#xff0c;所以很慢。而C/C程序是编译…

typedef函数指针_C语言函数指针之回调函数

1 什么是回调函数&#xff1f;首先什么是“回调”呢&#xff1f;我的理解是&#xff1a;把一段可执行的代码像参数传递那样传给其他代码&#xff0c;而这段代码会在某个时刻被调用执行&#xff0c;这就叫做回调。如果代码立即被执行就称为同步回调&#xff0c;如果过后再执行&a…

生成球 使用openMesh 库

简介 使用openmesh生成一个球&#xff0c;采用的是标准球坐标系。 // 生成球 n 最好输入偶数 10 或者 100 #include <iostream> #include <OpenMesh/Core/IO/MeshIO.hh> #include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh> #include<cmath> #d…

oracle存储过程没有返回值,Java调用Oracle存储过程(无返回值)

无返回值&#xff1a;1&#xff1a;创建存储过程此存储过程向表中插入一条数据create or replace procedure demo_procedure(id varchar2,name varchar2,age varchar2,sex varchar2,address varchar2)asbegininsert into system.demo values(id,name,age,sex,address);end;2&am…

python static函数_python函数怎么实现static变量?

展开全部python函数实现static变量具体32313133353236313431303231363533e4b893e5b19e31333365633838如下&#xff1a;def ask_ok(prompt, retries4, complaintYes or no, please!):while True:ok raw_input(prompt)if ok in (y, ye, yes): return Trueif ok in (n, no, nop, …

Linux权限管理、系统进程管理

权限管理 linux系统中分为四种角色 uuser 当前用户 ggroup 同组用户 oother 其他用户 aall 代表所有用户 三种权限 rread 可读 wwrite 可写 xexecute 可执行 通过ls -l(ll)查看文件或者目录的权限 ll a.log -rw-r--r--. 1 root root 16003 Jun 27 09:20 a.log 分析第一部…

fedora 安装oracle 12c,Fedora 12下安装Oracle 11客户端

目标&#xff1a;将oracle-client(v11)安装到rdquo;/opt/oracle/rdquo;下准备好如下三个安装包&#xff0c;放在某个目录下&#xff0c;如&#xff1a;/root/software/ora目标&#xff1a;将Oracle-client(v11)安装到”/opt/oracle/”下准备好如下三个安装包&#xff0c;放在某…

轨迹跟踪主要方法_DELMIA教程:基于指令形式的机器人TCP轨迹局部跟踪方法

上一期为大家介绍了基于工具条中的“TCP Trace”命令按钮的全局TCP轨迹跟踪&#xff0c;之所以称之为全局轨迹跟踪&#xff0c;是因为只要命令被打开&#xff0c;机器人运行的全部轨迹都将实现跟踪。既然有全局TCP轨迹跟踪&#xff0c;那么就一定有局部TCP轨迹跟踪&#xff0c;…

[转帖]开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别

开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别 https://www.geek-workshop.com/thread-1860-1-1.htmlliamjeal电梯直达1# 发表于 2012-9-10 13:41:43 | 只看该作者 |只看大图 因CooCox用户数及影响力越来越大&#xff0c;CooCox团队也逐渐提高了对软件及代码协议的重…

oracle数据库物理结构包含,Oracle - 数据库物理结构

● 一个数据文件只能属于一个数据库● 当数据库空间用完时&#xff0c;数据文件可以按照预定的设置自动扩展。● 一个或多个数据文件形成了数据库中的一种逻辑结构-表空间。当需要时&#xff0c;数据文件中的数据通过数据库操作被读出&#xff0c;并缓存于Oracle的内存结构中。…

python审批流系统_有赞移动关于权限与审批流程的标准化

一、背景有赞移动有weex发布平台、移动配置中心平台、App分发平台、热修复平台等。这些平台都需要发布&#xff0c;而发布就需要规范化&#xff0c;需要审批制度。如果为各个平台开发这个审批流程&#xff0c;看起来是一种浪费。首先想到第一种方案&#xff1a;接入现有的前后端…

生成一个平面矩形网格文件

简介 生成一个平面矩形网格。 代码 // CreateGrid.cpp: 定义控制台应用程序的入口点。 ////#include "stdafx.h" #include <iostream> #include <OpenMesh/Core/IO/MeshIO.hh> #include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh> #include<…

linux下tomcat脚本,Linux下重启多个 tomcat 服务的脚本(推荐)

由于修改tomcat的配置文件或手动操作数据库数据后&#xff0c;tomcat的缓存和redis的缓存很严重&#xff0c;需要经常重启tomcat来释放缓存&#xff0c;经常就是手动重启。# 1、查找tomcat的进程IDps -ef | grep tomcat# 2、根据路径去查找进程ID&#xff0c;然后逐个杀掉(毕竟…

qt 定时器累加值_零基础入门单片机定时器详解

一、基本定时器介绍在STM32中&#xff0c;基本定时器有TIM6、TIM7等。基本定时器主要包含时基单元&#xff0c;提供16位的计数&#xff0c;能计数0~65535。基本定时器除了计数功能以外&#xff0c;还能输出给DAC模块一个TRGO信号。基本定时器框图如下&#xff1a;二、时基单元介…

生成 一个多边形网格的函数

简介 生成一个多边形网格的函数。 三角形面片判断法线方向 顺时针&#xff0c;表示平面方向向下&#xff1f;&#xff1f; 逆时针&#xff0c;表示平面方向向上&#xff1f;&#xff1f; 代码 // AddPolygon.cpp: 定义控制台应用程序的入口点。 ////#include "stdafx.h&qu…

linux系统怎么设置开机密码,Linux_Linux系统怎么设置开机密码?Linux设置开机密码的方法,为了保证Linux系统的安全,应 - phpStudy...

Linux系统怎么设置开机密码&#xff1f;Linux设置开机密码的方法为了保证Linux系统的安全&#xff0c;应该给系统设置开机密码。注意&#xff0c;“开机密码”和“登录密码”是不同的。本文笔者就和大家分享一下“给Linux设置开机密码”的经验&#xff0c;希望能能对大家有所帮…