oracle-recursion

oracle-recursion

-- 创建一个BBS的表
CREATE TABLE BBS
(
PARENT_ID   NUMBER(9, 0)  NOT NULL,
ID          NUMBER(9, 0)  NOT NULL,
NAME        VARCHAR2(200) NOT NULL -- 板块、文章、评论等。
);
-- 插入数据
-- 这个表是个树状结构的表
/*
论坛首页
--数据库开发
----DB2
------DB2 文章1
--------DB2 文章1 的评论1
--------DB2 文章1 的评论2
------DB2 文章2
----Oracle
--Java 技术
*/
INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (0,0,'论坛首页');
INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (0,1,'数据库开发');
INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (1,11,'DB2');
INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (11,111,'DB2 文章1');
INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (111,1111,'DB2 文章1 的评论1');
INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (111,1112,'DB2 文章1 的评论2');
INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (11,112,'DB2 文章2');
INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (1,12,'Oracle');
INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (0,2,'Java 技术');
-- 递归查询在查询树状结构的表时,十分有用,切记切记切记
SELECT
-- LEVEL 是一个伪列,表示当前行所属层次,从 1 开始
LEVEL,
-- CONNECT_BY_ISLEAF 表示当前行是否是叶子节点。1 表示叶子节点,0 表示非叶子节点。
CONNECT_BY_ISLEAF,
-- CONNECT_BY_ROOT 是一个操作符,用来修饰列,表示该列的值是根节点的值。
CONNECT_BY_ROOT NAME,
-- SYS_CONNECT_BY_PATH 是一个函数,返回层次路径
SYS_CONNECT_BY_PATH(NAME, '/')
FROM 
BBS
-- START WITH 用来表示起始行
START WITH NAME = 'DB2'
-- CONNECT BY 用来指定父子连接条件
-- PRIOR 是一个操作符,用来修饰列,表示该列是父行中的列
CONNECT BY PRIOR ID = PARENT_ID
-- ORDER SIBLINGS BY 对同一层次中的行进行排序
ORDER SIBLINGS BY NAME
-- 查看所有BBS数据
SELECT
	* 
FROM
	bbs;
-- 11  112
-- 修改数据,也就是修改db2 文章2的id和文章1一样,但是父级id不同
-- 也就是说一个id拥有两个父级
update bbs set parent_id=1112,id=111
where name = 'DB2 文章2';
-- 检查错误
SELECT
-- CONNECT_BY_ISCYCLE 是一个伪列,1 表示存在循环引用,否则为 0
CONNECT_BY_ISCYCLE,
NAME
FROM 
BBS
-- NOCYCLE 指示 Oracle 出错不要停
CONNECT BY NOCYCLE PRIOR ID = PARENT_ID;
-- 将数据修改回正常状态
UPDATE bbs 
SET parent_id = 11,
id = 112 
WHERE
	name = 'DB2 文章2';
-- 也可以使用这个递归,精妙的无以伦比
WITH TEMP(PARENT_ID,ID,NAME) AS
(
SELECT PARENT_ID,ID,NAME FROM BBS WHERE NAME='DB2'---语句1
UNION ALL---语句2
SELECT B.PARENT_ID,B.ID,B.NAME FROM BBS B, TEMP T WHERE B.PARENT_ID=T.ID---语句3
)
SELECT NAME FROM TEMP;---语句4
-- 	你想生成从 1 到 100 的数字
SELECT ROWNUM FROM DUAL CONNECT BY ROWNUM <= 100;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值