DB2 with实现递归

网上找的一个例子,介绍递归

01.论坛首页  
02.--数据库开发  
03.----DB2  
04.------DB2 文章1  
05.--------DB2 文章1 的评论1  
06.--------DB2 文章1 的评论2  
07.------DB2 文章2  
08.----Oracle  
09.--Java技术  
 
以上是一个论坛的典型例子,下面我们新建一个表来存储以上信息。
--建表
drop table BBS;
CREATE TABLE BBS  
(  
PARENTID INTEGER NOT NULL,  
ID INTEGER NOT NULL,  
NAME VARCHAR(200) NOT NULL---板块、文章、评论等。  
);  
--插入数据
insert into bbs (PARENTID,ID,NAME) values   
(0,0,'论坛首页'),  
(0,1,'数据库开发'),  
(1,11,'DB2'),  
(11,111,'DB2 文章1'),  
(111,1111,'DB2 文章1 的评论1'),  
(111,1112,'DB2 文章1 的评论2'),  
(11,112,'DB2 文章2'),  
(1,12,'Oracle'),  
(0,2,'Java技术');  


 
假设现在让你查询一下‘DB2 文章1’的所有评论,有人说,这还不简单,如下:
 SELECT * FROM BBS WHERE PARENTID=(SELECT ID FROM BBS WHERE NAME='DB2 文章1');  

答案完全正确。
那么,现在让你查询一下DB2的所有文章及评论,怎么办?

传统的方法就很难查询了,这时候递归查询就派上用场了,如下:
 
WITH TEMP(PARENTID,ID,NAME) AS  
(  
SELECT PARENTID,ID,NAME FROM BBS WHERE NAME='DB2'      ---语句1  
UNION ALL          ---语句2 
SELECT B.PARENTID,B.ID,B.NAME FROM BBS AS B, TEMP AS T WHERE B.PARENTID=T.ID       ---语句3  
)  
SELECT NAME FROM TEMP;      ---语句4  


WITH 子句内的第一个 SELECT 语句是初始化表。它只执行一次。它的结果形成虚拟表的初始内容以作为递归的种子。在上面的示例中,种子是 'NAME' 为  DB2的一行或多行。 
第二个 SELECT 语句执行多次。将种子作为输入传递给第二个 SELECT 语句以产生下一个行集合。将结果添加(UNION ALL)到虚拟表的当前内容中,并放回到其中以形成用于下一次传递的输入。只要有行产生,这个过程就会继续。 

运行后,我们发现,结果完全正确,那它到底是怎么运行的呢?下面我们详细讲解一下。
1、首先,语句1将会执行,它只执行一次,作为循环的起点。得到结果集:DB2
2、接着,将循环执行语句3,这里我们有必要详细介绍一下。
首先语句3的意图是什么呢?说白了,它就是查找语句1产生结果集(DB2)的下一级,那么在目录树中DB2的下一级是什么呢?是‘DB2 文章1’和‘DB2 文章2’

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值