文档章节

使用Connect by进行递归查询

吐槽的达达仔
 吐槽的达达仔
发布于 2014/12/05 22:17
字数 520
阅读 11
收藏 0
首先和使用WITH做递归查询一样,给数据库表插入一定的数据。
CREATE TABLE BBS
 (
 PARENTID INTEGER NOT NULL,
 ID INTEGER NOT NULL,
 NAME VARCHAR(200) NOT NULL
 );
insert into bbs (PARENTID,ID,NAME) values (0,1,'数据库开发');
insert into bbs (PARENTID,ID,NAME) values (1,11,'DB2');
insert into bbs (PARENTID,ID,NAME) values (11,111,'DB2 文章1');
insert into bbs (PARENTID,ID,NAME) values (111,1111,'DB2 文章1 的评论1');
insert into bbs (PARENTID,ID,NAME) values (111,1112,'DB2 文章1 的评论2');
insert into bbs (PARENTID,ID,NAME) values (11,112,'DB2 文章2');
insert into bbs (PARENTID,ID,NAME) values (1,12,'Oracle');
insert into bbs (PARENTID,ID,NAME) values (0,2,'Java 技术');
COMMIT;

select * from BBS  
start with name = ‘DB2文章1的评论2’  --从某一个节点开始,进行向上递归
connect by prior PARENTID = ID;  --连接条件

查询结果为:
PARENTID   ID   NAME
111       1112    DB2文章1的评论2
11        111     DB2文章1
1         11      DB2
0         1       数据库开发

但是如果你的递归循环中出现了死循环,这条SQL就执行不了了。
如果你要忽略报错执行该SQL,可以使用NOCYCLE关键字,如下。
INSERT INTO BBS(PARENTID,ID,NAME)VALUES(111,1,’DB2论文’);

select * from BBS  
start with name = ‘DB2文章1的评论2’  --从某一个节点开始,进行向上递归
connect by prior PARENTID = ID;  --连接条件
NOCYCLE

在CONNECT BY语句上面还可以增加一些辅助的伪列,如:
level:标记层级级数,最上层节点为1,之后为2、3……。
CONNECT_BY_ISCYCLE:标记此节点是否为某一个祖先节点的父节点,导致循环,1为是,0为否。
CONNECT_BY_ISLEAF :标记此节点是否为叶子节点,即没有子节点,1为是,0为否。
CONNECT_BY_ROOT:标记此节点的祖先节点,后面加列名或表达式,取祖先节点的记录值。
EXAMPLE:
select a.child,
       a.PARENTID,
       level "层次",
       sys_connect_by_path(ID, '->') "合并层次",
       prior a.PARENTID "父节点",
       connect_by_root a.ID "根节点",
       decode(connect_by_isleaf, 1, a.ID, null) "子节点",
       decode(connect_by_isleaf, 1, '是', '否') "是否子节点"
from BBS a
start with name = ‘DB2文章1的评论2’  --从某一个节点开始,进行向上递归
connect by NOCYCLE prior PARENTID = ID;  --连接条件

本文转载自:http://dacoolbaby.iteye.com/blog/1634571

吐槽的达达仔
粉丝 28
博文 104
码字总数 7105
作品 0
广州
程序员
私信 提问
PostgreSQL Oracle 兼容性 - connect by 2

标签 PostgreSQL , Oracle , 树形查询 , 递归 , connect by , tablefunc , connectby 背景 Oracle connect by语法经常用于有树形关系的记录查询,PostgreSQL使用CTE递归语法,可以实现同样的...

德哥
2018/10/05
0
0
oracle的connect by语句

oracle中可以用CONNECT BY子句实现递归查询,其基本语法是: select ... from <TableName> where <Conditional-1> start with <Conditional-2> connect by [nocycle]<Conditional-3> order s......

hulubo
2012/04/07
956
0
T-SQL查询进阶--详解公用表表达式(CTE)

简介 对于SELECT查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的.但是,视图是作为系统对象存在数据库中,那对...

范大脚脚
2017/12/21
0
0
DNS解析原理:递归 VS 迭代

DNS 解析分类 DNS解析流程分为递归查询和迭代查询,递归查询是以本地名称服务器为中心查询, 递归查询是默认方式,迭代查询是以DNS客户端,也就是客户机器为中心查询。其实DNS客户端和本地名...

大富帅
03/18
0
0
数据库递归查询:MySQL VS Sequelize

一、前言 最近在做团队的排期系统改版时涉及到数据库的递归查询问题,有一个需求数据表,表中的需求数据以parentId为外键定义数据的继承关系,需求之间的关系呈现树状关系。需求数据表如下:...

嘻嘻哈哈学习
04/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
5
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
9
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
8
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
今天
7
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
今天
10
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部