start with connect by prior的使用方法
转载文章地址: https://www.cnblogs.com/benbenduo/p/4588612.html
测试数据
创建表
create table TEST_TABLE
(parentid VARCHAR2(10),subid VARCHAR2(10)
);
插入测试数据
insert into test_table (PARENTID, SUBID) values ('1', '2');
insert into test_table (PARENTID, SUBID) values ('1', '3');
insert into test_table (PARENTID, SUBID) values ('2', '4');
insert into test_table (PARENTID, SUBID) values ('2', '5');
insert into test_table (PARENTID, SUBID) values ('3', '6');
insert into test_table (PARENTID, SUBID) values ('3', '7');
insert into test_table (PARENTID, SUBID) values ('5', '8');
insert into test_table (PARENTID, SUBID) values ('5', '9');
insert into test_table (PARENTID, SUBID) values ('7', '10');
insert into test_table (PARENTID, SUBID) values ('7', '11');
insert into test_table (PARENTID, SUBID) values ('10', '12');
insert into test_table (PARENTID, SUBID) values ('10', '13');
数据结构
使用场景
主要是用于B树等类型结构的递归查询,我们可以通过树中的任意一个节点来遍历该树。
语法格式
select … from tablenamestart with 条件1connect by *** prior ***where 条件3;
语法说明
start with
: 遍历的开始节点,可以是父节点也可以是子节点父节点
SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.parentid = '3' CONNECT BY PARENTID = PRIOR SUBIDORDER BY LEVEL DESC
结果:
上面start with
后面接的是父节点为3,遍历的结果就是以3位父节点的所有数据,如果父节点是最后的叶子节点(比如13),那么查询结果就是空。子节点
SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.subid = '7' CONNECT BY PARENTID = PRIOR SUBIDORDER BY LEVEL DESC
结果
可以看到子节点subid
是从7开始的。
connect by prior
: 连接条件。关键词prior
,prior
跟父节点列放在一起,就是往父结点方向遍历,prior
跟子结点列放在一起,则往叶子结点方向遍历,父节点与子节点谁放在“=”
前都无所谓,关键是prior
跟谁在一起。可以看到在上面的案例中
start with
后面无论是接的subid
还是parentid
都是向树的下方(子节点)去遍历。这个就是与prior
是与谁连接在一起有关了。上面的两个例子中与prior
连接在一起的都是subid
,因此都是向子节点去遍历。prior
与parentid
相连SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.subid = '7' CONNECT BY subid = PRIOR parentidORDER BY LEVEL DESC
结果
可以看到此时是向父节点去遍历的。因为prior
后面是紧跟的parentid
。
使用level
在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2。需要注意的是这里所说的根节点指的是start with后面的那个节点
parentid为第一层级
SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.parentid = '7'
CONNECT BY parentid = PRIOR subidORDER BY LEVEL DESC;
SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.parentid = '7'
CONNECT BY subid = PRIOR parentidORDER BY LEVEL DESC;
可以看到无论prior
后面接的是parentid
还是subid
,第一层级都是parentid
为7(start with
后面的值)。
subid为第一层级
SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.subid = '7'
CONNECT BY parentid = PRIOR subidORDER BY LEVEL DESC;
SELECT T.PARENTID, T.SUBID, LEVELFROM TEST_TABLE TSTART WITH T.subid = '7'
CONNECT BY subid = PRIOR parentidORDER BY LEVEL DESC;
此时可以看到无论prior
后面接的是parentid
还是subid
,当start with
后面接的是subid
为7时,那么第一层级都是subid
为7。
start with connect by prior的使用方法相关推荐
- Oracle系列:start with connect by prior 使用方法
一.语法 { CONNECT BY [ NOCYCLE ] condition [AND condition]... [ START WITH condition ] | START WITH con ...
- Oracle中start with xx connect by prior 语句解析
Oracle中start with xx connect by prior 语句解析 Oracle这种的start with语句主要对B型树的数据进行递归查询.可以指定数据树上的任一节点,然后查找 ...
- oracle 递归查询,Oracle递归查询(start with…connect by prior)
查询基本结构: select - from table_name start with 条件1 connect by 条件2 1.建测试用表 1 create table test_prior( 2 ...
- Oracle 树操作(select…start with…connect by…prior)
oracle树查询的最重要的就是select-start with-connect by-prior语法了.依托于该语法,我们可以将一个表形结构的以树的顺序列出来.在下面列述了oracle中树型查询的 ...
- 用select 语句中的START WITH...CONNECT BY PRIOR子句实现递归查询
from http://www.javaeye.com/topic/184074 今天发现在oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归 ...
- SQL基础--层次化查询(START BY ... CONNECT BY PRIOR)
为什么80%的码农都做不了架构师?>>> --====================================================== --SQL基础--& ...
- Oracle中start with...connect by prior子句用法
http://www.cnblogs.com/ZHF/archive/2008/09/10/1288101.html Oracle中start with...connect by prior子句用法 ...
- 在oracle中通过connect by prior来实现递归查询!
connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start by cond1 connect by cond2 where cond3; ...
- oracle中用START WITH...CONNECT BY PRIOR子句实现递归查询
今天发现在oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: select . ...
最新文章
- 高并发:RocketMQ 削峰实战
- 《深入浅出Ext JS(第2版)》获专家好评
- 手机上可以学python吗_Python爬虫也能用手机进行抓包?没错!这个技巧我只告诉你...
- DataGrip按某列大小对数据集进行排序
- 发了篇paper,双非二本的她直博浙大
- 信息学奥赛一本通 1397:简单算术表达式求值 | OpenJudge NOI 1.12 01:简单算术表达式求值
- 资源放送丨《Oracle RAC 集群安装部署》PPT视频
- 计算机快捷键m是什么,教程方法;m、ac快捷键电脑技巧-琪琪词资源网
- *N#1234567CG,解析征信报告里的暗语
- python跟java 效率_Python注重可读性和效率:与Java、PHP以及 C++语言对比谁受欢迎?...
- idea svn 的使用----转载,挺好的
- 万能的搜索--之DFS(二)
- QML 自定义鼠标光标
- ICS工业控制安全类方向赛题简单总结
- php渐变闪动字体代码,33种超好看彩色闪字渐变代码分享
- 网站特效圈小猫游戏代码
- 勒让德多项式的正交性和归一化
- 2G 3G和4G物联网卡之间的区别
- 大数据行业最顶尖明星人才TOP20
- 手写识别ocr java,OCR 指的是手写文字技术_学小易找答案
热门文章
- php.c drcom,成功 将校园客户端drcom搞进openwrt
- npm i 安装插件报:permission denied, symlink
- Mac升级Catalina,根目录下无法创建个人文件夹
- java int类型 BigDecimal类型转成汉字金额大写
- 笔记本电脑怎样当无线服务器,笔记本当无线路由器怎么设置【详细步骤】
- Verilog AXI Components
- Cent os 安装 JDK , 配置JAVA_HOME
- 设计模式之桥接模式:如何实现抽象协议与不同实现的绑定?
- 如何区分电梯卡为id卡ic卡_门禁卡是选择IC卡好还是ID卡好
- vscode 下载地址