博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ORACLE 递归查询
阅读量:5094 次
发布时间:2019-06-13

本文共 2392 字,大约阅读时间需要 7 分钟。

既然会看ORACLE递归查询那么大家应该是比较清楚递归是什么意思了,在这里我就不多加说明了,只作简单介绍了。

言归正传所谓递归查询那么数据表中数据的结构应该是符合递归查询的基本条件,即表中有ID,PID(节点编号、父节点编号)如果把数据以UI的方式展现出来应该是一棵或多棵树了。

那么我们要以其中一个节点去递归查询出这个节点子节点或父节点的过程就是我们所要说明的。

递归查询语法:

 

select ... from tablename  where 条件4 start with 条件1  connect by 条件2 AND 条件3

 

如下面的表结构

CREATE TABLE SC_DISTRICT(  IID         NUMBER(10)                  NOT NULL,  PARENT_ID  NUMBER(10),  INAME       VARCHAR2(255 BYTE)          NOT NULL, BZ      NUMBER(4) );ALTER TABLE SC_DISTRICT ADD (  CONSTRAINT SC_DISTRICT_PK PRIMARY KEY (IID));ALTER TABLE SC_DISTRICT ADD (  CONSTRAINT SC_DISTRICT_R01  FOREIGN KEY (PARENT_ID)  REFERENCES SC_DISTRICT (IID));
INSERT INTO SC_DISTRICT(IID,INAME) VALUES(1,'四川省');INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES(2,1,'巴中市',0);INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES(3,1,'达州市',0); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES(4,2,'巴州区',0);INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES(5,2,'通江县',0);INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES(6,2,'平昌县',0);INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES(7,3,'通川区',0);INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES(8,3,'宣汉县',0);INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES(9,8,'塔河乡',1);INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES(10,8,'三河乡',1);INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES(11,8,'胡家镇',1);INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES(12,8,'南坝镇',1); INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES(13,6,'大寨乡',2);INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES(14,6,'响滩镇',2);INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES(15,6,'龙岗镇',2);INSERT INTO SC_DISTRICT(IID,PARENT_ID,INAME,BZ) VALUES(16,6,'白衣镇',2); 如果如图

 

--查询平昌县的子节点

SELECT * FROM SC_DISTRICT

START WITH INAME = '平昌县'
CONNECT BY PRIOR IID = PARENT_ID

--查询平昌县的父节点

SELECT * FROM SC_DISTRICT

START WITH INAME = '平昌县'
CONNECT BY PRIOR  PARENT_ID= IID

--只是查询当前节点BZ为0的,但不会查询节点BZ为0的子节点(这点大家注意了)

SELECT * FROM SC_DISTRICT

START WITH INAME = '平昌县' AND BZ = 0
CONNECT BY PRIOR  PARENT_ID= IID ;

--查询当前节点和子节点的BZ为0的方法

SELECT * FROM SC_DISTRICT WHERE BZ = 0

START WITH INAME = '平昌县'
CONNECT BY PRIOR PARENT_ID= IID

--此方式不仅可以查询BZ为0的节点而且会不再去遍历此节点的子节点

SELECT * FROM SC_DISTRICT START WITH INAME = '平昌县'

CONNECT BY PRIOR PARENT_ID= IID AND BZ = 0

如果大家对递归的方式比较了解的话上面的几种方式就很容易理解了。

转载于:https://www.cnblogs.com/bpdwn/archive/2013/06/08/3125987.html

你可能感兴趣的文章
PHP批量覆盖文件并执行cmd命令脚本
查看>>
Unity之fragment shader中如何获得视口空间中的坐标
查看>>
支持向量机——内核
查看>>
MFC注册热键
查看>>
万能的SQLHelper帮助类
查看>>
如何在 Terminal 内可以“用惯用的编辑器”快速打开“目前正在做”的专案(project)呢?...
查看>>
uboot分析:uboot的启动过程分析
查看>>
tmux的简单快捷键
查看>>
springboot笔记04——读取配置文件+使用slf4j日志
查看>>
[Swift]LeetCode653. 两数之和 IV - 输入 BST | Two Sum IV - Input is a BST
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
微信小程序的wxml文件和wxss文件在webstrom的支持
查看>>
[AngularJS] Lazy Loading modules with ui-router and ocLazyLoad
查看>>
.Net Com口通信编程例子
查看>>
js 编程笔记 【无名函数】
查看>>
Java相对路径/绝对路径总结
查看>>
一个优秀的研发团队应该具备什么特征
查看>>
Jenkins问题汇总
查看>>
QT 项目文件介绍
查看>>
tr69c 调试报错检查
查看>>