Oracle层次查询start with connect by
博客参考:https://www.cnblogs.com/jerryxing/articles/2339352.html
start with connect by 层次查询(Hierarchical Queries)
语法:
SELECT *
FROM table
START WITH ID = 1
CONNECT BY PRIOR PID = ID
start with: 表示根记录的条件
connect by: 指定了父记录行和子记录行之间的关系,在层次查询中,条件表达式必须使用prior操作符来指定父记录行
如:
CONNECT BY PRIOR pid = id 或者CONNECT BY pid = PRIOR id
如果connect by 条件是一个组合条件,那么只有一个条件需要prior操作符,
如:
CONNECT BY last_name != 'King' AND PRIOR employee_id = manager_id
不过,connect by 不能包含子查询。
prior是一个二元操作符,最常见的是用于列值相等的比较,它让Oracle使用对应列的父亲行的值。使用非相等比较,极有可能倒致查询陷入无穷循环,以出错终止。
Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。可以通过一个简单的例子来理解其使用的概念和方法。
创建表示例:
CREATE TABLE tbl_test
(
ID NUMBER,
NAME VARCHAR2(10),
pid NUMBER DEFAULT 0
); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('','','');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('','','');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('','','');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('','','');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('','','');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('','','');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('','','');
查询表数据:

从父记录行向子记录行递归
select * from TBL_TEST start with id=1 connect by prior id=pid

根节点为id=1
connect by prior id=pid 由id和pid建立父子关系,id=1开始,在pid寻找等于1的值,可以找到2和4,在pid=2,4 中找,找到id有5和9俩个。
从子记录向父记录递归
select * from TBL_TEST start with id=5 connect by prior pid=id

根节点为id=5
connect by prior pid=id id=5时,找pid为2,在找id=2的行,找到pid=1,再找id=1的行
LEVEL,ROW_NUMBER,OVER的应用
SELECT LEVEL,
pid,
ROW_NUMBER () OVER (PARTITION BY pid ORDER BY pid) by_pid,
ROW_NUMBER () OVER (ORDER BY pid) AS rn, NAME
FROM tbl_test
START WITH pid = 0
CONNECT BY PRIOR ID = pid
ORDER BY 1
记录如下:

Oracle层次查询start with connect by的更多相关文章
- Oracle 层次查询 connect by
oracle 层次查询 语法: SELECT ... FROM [WHERE condition] --过 ...
- Oracle层次查询
Oracle层次查询的语法如下: 下面根据两道“烧脑”的题具体来体现: 1. 根据时间先后顺序,十二星座的英文名称用逗号串起来为'Aries,Taurus,Gemini,Cancer,Leo,Virg ...
- 带您了解Oracle层次查询
http://database.51cto.com/art/201010/231539.htm Oracle层次查询(connect by )是结构化查询中用到的,下面就为您介绍Oracle层次查询的 ...
- 【转载】Oracle层次查询和分析函数
摘要 一组连续的数,去掉中间一些数,如何求出剩下的数的区间(即号段)?知道号段的起止,如何求出该号段内所有的数?知道一个大的号段范围和已经取过的号段,如何求出可用的号段?利用Oracle提供的强大的查 ...
- Oracle层次查询和分析函数在号段选取中的应用
转自:http://www.itpub.net/thread-719692-1-1.html 摘要一组连续的数,去掉中间一些数,如何求出剩下的数的区间(即号段)?知道号段的起止,如何求出该号段内所有的 ...
- Oracle - 层次查询
如果表中含有层次数据,可以通过使用层次查询有序地查看层次数据. 语法: condition:指一个或多个表达式和逻辑(布尔)运算符的组合,并返回TRUE.FALSE或UNKNOWNstart with ...
- oracle层次查询的陷阱
今天开发组同事找到我,说一个简单的层次查询非常慢,业务就是有一个存设备表连接关系的表,从node1连入,从node2连出,现在要找出node2的连出顺序,sql类似于: SELECT LEVEL ID ...
- 【转】 oracle 层次查询判断叶子和根节点
Oracle 9i判断是叶子或根节点,是比较麻烦的一件事情,SQL演示脚本如下: DROP TABLE idb_hierarchical; create TABLE idb_hierarchical ...
- oracle树形查询 start with connect by
一.简介 在oracle中start with connect by (prior) 用来对树形结构的数据进行查询.其中start with conditon 给出的是数据搜索范围, connect ...
随机推荐
- MySQL主从双向同步
最近部署测试环境,涉及到MySQL数据库主从双向同步的部署,记录一下部署过程,正常读写都发生在主库,从库作为备选数据库(热备份),当主库发生异常,数据库自动切换到从库,这里面是怎么监控数据库异常并触发 ...
- SpringMVC整合SpringFox实践总结
项目中使用的swagger框架在生成api文档时存在一些问题: 1. 控制器下方法无法点击展开 2.api内容结构混乱 基于上述原因,重新整合重构了一下api文档生成的代码.在此将重整过程记录下来,方 ...
- /lib64/libstdc++.so.6: version `CXXABI_1.3.8’ not found(转载)
原文地址:https://blog.csdn.net/EI__Nino/article/details/100086157 终极一战 绝命一击 ImportError: /lib64/libstdc+ ...
- JPA,Hibernate,Spring Data JPA之间的关系
什么么是JPA? 全称Java Persistence API(JAVA对象持久化API),可以通过注解或者XML描述[对象-关系表]之间的映射关系,并将实体对象持久化到数据库中. 为我们提供了: 1 ...
- [Spark News] Spark + GPU are the next generation technology
一.资源:Spark进行机器学习,支持GPU From:https://my.oschina.net/u/2306127/blog/1602291 为了使用Spark进行机器学习,支持GPU是必须的, ...
- Java之Apache Tomcat教程[归档]
前言 笔记归档类博文. 本博文地址:Java之Apache Tomcat教程[归档] 未经同意或授权便复制粘贴全文原文!!!!盗文实在可耻!!!贴一个臭不要脸的:易学教程↓↓↓ Step1:安装JDK ...
- Sql 备忘——行号
SELECT row_number() over(order by Product.ID) as [row_number]
- python之函数形参、实参、可变长参数整体使用和分类
形参与实参 '''def fn(形参们): pass fn(实参们)'''# 形参:定义函数,在括号内声明的变量名,用来结束外界传来的值# 实参:调用函数,在括号内传入的实际值,值可以为常量.变量.表 ...
- Compress and decompress string
You are given a string with lower case letters only. Compress it by putting the count of the letter ...
- Oracle的查询-单行查询
单行函数:作用于一行,返回一个值 多行函数:作用于多行,返回一个值 字符函数 --小写变大写 select upper('yes') from dual; --YES --大写变小写 select u ...