DB2递归查询

db2中的递归查询使用with来实现,也称为公共表达式,公共表达式在select语句的开始部分采用with子句的形式,在使用公共表达式的查询中可以多次使用它,并且公共表达式还可以通过取别名来连接到他本身,这样的话就可以达到循环的目的。
递归查询通常有3个部分需要定义:
一:一个公共表达式形式的虚拟表。
二:一个初始化表。
三:一个与虚拟表进行完全内连接的辅助表。
需要使用UNION all合并上边3个查询,然后用select从递归输出中得到最终的结果。
大体上如下形式
with XX(x1,x2,x3) as  -------@0
(
 select a.s,a.s1 from a  ----@1
 union all  ----@2
 select * from a,xx where a.s=xx.x1 ------@3
)
select ... from xx where .... -------@4
@0:为with体,即虚拟表
@1:为初始化表,这里需要定义初始化的一些行,也就是你递归的出发点,或者说父行,这部分逻辑只执行一次,它的结果作为虚拟表递归的初始化内容。
@2:这里必须用UNION all
@3:这里需要定义递归的条件(辅助表),这里定义递归的逻辑,需要注意的是父行和子行进行连接的时候逻辑一定要清楚父子关系,不然很容易变成死循环的,这里首先将初始化表的结果作为条件进行查询,在把执行的结果添加到虚拟表中,只要这里能查询出来记录,那么就会进行下一步递归循环。
@4:这里就是对虚拟表的查询语句。

例子:
WITH ROOT AS
(
 SELECT a.id, a.areaname
 FROM AREATB a
 WHERE a.id = #id#
 UNION ALL
 SELECT a.id, a.areaname
 FROM AREATB a, ROOT r
 WHERE a.id = r.id
)

SELECT id, areaname
FROM ROOT

posted on 2010-07-30 16:36 飞熊 阅读(803) 评论(0)  编辑  收藏 所属分类: DataBase


只有注册用户登录后才能发表评论。


网站导航:
 
<2010年7月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

文章分类

文章档案

收藏夹

搜索

最新评论

阅读排行榜

评论排行榜