天地不仁,以万物为刍狗!
[原]关于db2递归的一个例子
上一篇 / 下一篇 2008-03-14 13:58:12 / 个人分类:db2
关于db2递归的一个例子ITPUB个人空间1Z$oM.j Po
1V]pvtp6@%Z+T0ORACLE中大家可能对递归(在oracle中很多人称作家族树)已经很熟悉,因为ORACLE中的递归比较简单,也容易掌握!刚接触DB2的时候,也碰到过递归的问题,因为研究的人少所以刚接触的时候,对db2有一种神秘的感觉,db2是很强大的这个误用质疑!就sql而言,凡是oracle用sql能实现的,db2肯定或多或少也可以实现,只是逻辑复杂点!因为一直有人提问这边的问题,所以今天抽时间写了一点
ITPUB个人空间H4u"G}Pr%Q0i$[
ITPUB个人空间6mWiHk _1V YM5Q
首先,关于db2的递归的一点基础知识:
j;c9]p T Q5m0
p4qF~%f J[0db2中的递归查询使用with来实现,也称为公共表达式,公共表达式在select语句的开始部分采用with子句的形式,在使用公共表达式的查询中可以多次使用它,并且公共表达式还可以通过取别名来连接到他本身,这样的话就可以达到循环的目的。ITPUB个人空间'hwUa0^J o3r
ITPUB个人空间Zh9Fd~u_4Vr,SOp*?
递归查询通常有3个部分需要定义:ITPUB个人空间vp5x#gyT$fW\fVP
ITPUB个人空间9wz/K1hQ3s:J
一:一个公共表达式形式的虚拟表。ITPUB个人空间1RmC$K:P0\5jIfi
二:一个初始化表。
Q K8h.u*PwSPX0三:一个与虚拟表进行完全内连接的辅助表。
|'Rb)p%E0ITPUB个人空间kmix;q]]
需要使用UNION all合并上边3个查询,然后用select从递归输出中得到最终的结果。ITPUB个人空间 Id+n/G%JN _2p
8D-OoCNb0大体上如下形式
!T#z:r!q8`\:x0with XX(x1,x2,x3) as -------@0
E,{ `._L@0(
HU A8D|0select a.s,a.s1 from a ----@1ITPUB个人空间!];n"cE9[:o
union all ----@2ITPUB个人空间\r'YhtD
select * from a,xx where a.s=xx.x1 ------@3ITPUB个人空间]W!z}V
)ITPUB个人空间!x3N@ X E9^
select ... from xx where .... -------@4ITPUB个人空间%cYi:x2Nz?Q7[Y
ITPUB个人空间el'Z lt1J
@0:为with体,即虚拟表
R[1NE;N0@1:为初始化表,这里需要定义初始化的一些行,也就是你递归的出发点,或者说父行,这部分逻辑只执行一次,它的结果作为虚拟表递归的初始化内容。ITPUB个人空间)K!L5@&e*K$o
@2:这里必须用UNION all
*Qh0~k}pJ0@3:这里需要定义递归的条件(辅助表),这里定义递归的逻辑,需要注意的是父行和子行进行连接的时候逻辑一定要清楚父子关系,不然很容易变成死循环的,这里首先将初始化表的结果作为条件进行查询,在把执行的结果添加到虚拟表中,只要这里能查询出来记录,那么就会进行下一步递归循环。ITPUB个人空间0^I})_!mB
@4:这里就是对虚拟表的查询语句。
1~8ihM1h p~0
Rek Thv0M0关于关于递归更多的知识,可以到google中找更专业的资料,这里只讲我理解的一些东西。
,@bBr-|Q0这里举一个简单点的例子:
BLh*H"},]8t(W9{0
@+v!s;^"t9A0-------------------------------
u;n Z?8N cd0Q:求一SQL--关于数据纵横转换的
8Oj*vN W0ITPUB个人空间Q@ Y{/T q
ITPUB个人空间5E5EV,n N-v7E
假设表A中有以下数据ITPUB个人空间,[~2],ZxR q PB
A1 1 01
9Xr0| IDH1j0A1 1 02ITPUB个人空间Xcl*PwSC3LqgD
A1 1 03ITPUB个人空间t\Z/X-?
A2 1 01ITPUB个人空间drWA7n1\7[
A2 2 01ITPUB个人空间(u$y,i;AxS!h#om]h
A2 2 02ITPUB个人空间4R*{.P2sU)u
现希望一SQL能够查出下边这样的数据(暂时假设表A中第三列只有01-03这三种可能值)
kb-w I1w0A1 1 01-02-03ITPUB个人空间'[Mr6l5B"z)H d6j
A2 1 01ITPUB个人空间*nz9p4c+vnE
A2 2 01-02
9GO.f M6VB2mdb,]~0ITPUB个人空间@2m3rz$gaO.s
A:这个查询牵扯到全表的递归循环,用一般的sql语句很难搞定!
w_ @5_(JUm'X0B0ITPUB个人空间*io)T`6r:M
这是我刚写的一个递归语句!分享给大家看看!
]!Y)G Zw;s0
-@o${Q(NO9j,Y"jo0因为懒,所以把建立测试表的逻辑也略去了,这里用with来生成上边的测试数据。
-]2C$s J ZqY0with t (t1,t2,t3) as (
1V]pvtp6@%Z+T0ORACLE中大家可能对递归(在oracle中很多人称作家族树)已经很熟悉,因为ORACLE中的递归比较简单,也容易掌握!刚接触DB2的时候,也碰到过递归的问题,因为研究的人少所以刚接触的时候,对db2有一种神秘的感觉,db2是很强大的这个误用质疑!就sql而言,凡是oracle用sql能实现的,db2肯定或多或少也可以实现,只是逻辑复杂点!因为一直有人提问这边的问题,所以今天抽时间写了一点
ITPUB个人空间H4u"G}Pr%Q0i$[ITPUB个人空间6mWiHk _1V YM5Q
首先,关于db2的递归的一点基础知识:
j;c9]p T Q5m0
p4qF~%f J[0db2中的递归查询使用with来实现,也称为公共表达式,公共表达式在select语句的开始部分采用with子句的形式,在使用公共表达式的查询中可以多次使用它,并且公共表达式还可以通过取别名来连接到他本身,这样的话就可以达到循环的目的。ITPUB个人空间'hwUa0^J o3r
ITPUB个人空间Zh9Fd~u_4Vr,SOp*?
递归查询通常有3个部分需要定义:ITPUB个人空间vp5x#gyT$fW\fVP
ITPUB个人空间9wz/K1hQ3s:J
一:一个公共表达式形式的虚拟表。ITPUB个人空间1RmC$K:P0\5jIfi
二:一个初始化表。
Q K8h.u*PwSPX0三:一个与虚拟表进行完全内连接的辅助表。
|'Rb)p%E0ITPUB个人空间kmix;q]]
需要使用UNION all合并上边3个查询,然后用select从递归输出中得到最终的结果。ITPUB个人空间 Id+n/G%JN _2p
8D-OoCNb0大体上如下形式
!T#z:r!q8`\:x0with XX(x1,x2,x3) as -------@0
E,{ `._L@0(
HU A8D|0select a.s,a.s1 from a ----@1ITPUB个人空间!];n"cE9[:o
union all ----@2ITPUB个人空间\r'YhtD
select * from a,xx where a.s=xx.x1 ------@3ITPUB个人空间]W!z}V
)ITPUB个人空间!x3N@ X E9^
select ... from xx where .... -------@4ITPUB个人空间%cYi:x2Nz?Q7[Y
ITPUB个人空间el'Z lt1J
@0:为with体,即虚拟表
R[1NE;N0@1:为初始化表,这里需要定义初始化的一些行,也就是你递归的出发点,或者说父行,这部分逻辑只执行一次,它的结果作为虚拟表递归的初始化内容。ITPUB个人空间)K!L5@&e*K$o
@2:这里必须用UNION all
*Qh0~k}pJ0@3:这里需要定义递归的条件(辅助表),这里定义递归的逻辑,需要注意的是父行和子行进行连接的时候逻辑一定要清楚父子关系,不然很容易变成死循环的,这里首先将初始化表的结果作为条件进行查询,在把执行的结果添加到虚拟表中,只要这里能查询出来记录,那么就会进行下一步递归循环。ITPUB个人空间0^I})_!mB
@4:这里就是对虚拟表的查询语句。
1~8ihM1h p~0
Rek Thv0M0关于关于递归更多的知识,可以到google中找更专业的资料,这里只讲我理解的一些东西。
,@bBr-|Q0这里举一个简单点的例子:
BLh*H"},]8t(W9{0
@+v!s;^"t9A0-------------------------------
u;n Z?8N cd0Q:求一SQL--关于数据纵横转换的
8Oj*vN W0ITPUB个人空间Q@ Y{/T q
ITPUB个人空间5E5EV,n N-v7E
假设表A中有以下数据ITPUB个人空间,[~2],ZxR q PB
A1 1 01
9Xr0| IDH1j0A1 1 02ITPUB个人空间Xcl*PwSC3LqgD
A1 1 03ITPUB个人空间t\Z/X-?
A2 1 01ITPUB个人空间drWA7n1\7[
A2 2 01ITPUB个人空间(u$y,i;AxS!h#om]h
A2 2 02ITPUB个人空间4R*{.P2sU)u
现希望一SQL能够查出下边这样的数据(暂时假设表A中第三列只有01-03这三种可能值)
kb-w I1w0A1 1 01-02-03ITPUB个人空间'[Mr6l5B"z)H d6j
A2 1 01ITPUB个人空间*nz9p4c+vnE
A2 2 01-02
9GO.f M6VB2mdb,]~0ITPUB个人空间@2m3rz$gaO.s
A:这个查询牵扯到全表的递归循环,用一般的sql语句很难搞定!
w_ @5_(JUm'X0B0ITPUB个人空间*io)T`6r:M
这是我刚写的一个递归语句!分享给大家看看!
]!Y)G Zw;s0
-@o${Q(NO9j,Y"jo0因为懒,所以把建立测试表的逻辑也略去了,这里用with来生成上边的测试数据。
-]2C$s J ZqY0with t (t1,t2,t3) as (