db2中的遞歸查詢使用with來(lái)實(shí)現(xiàn),也稱為公共表達(dá)式,公共表達(dá)式在select語(yǔ)句的開始部分采用with子句的形式,在使用公共表達(dá)式的查詢中可以多次使用它,并且公共表達(dá)式還可以通過取別名來(lái)連接到他本身,這樣的話就可以達(dá)到循環(huán)的目的。
遞歸查詢通常有3個(gè)部分需要定義:
一:一個(gè)公共表達(dá)式形式的虛擬表。
二:一個(gè)初始化表。
三:一個(gè)與虛擬表進(jìn)行完全內(nèi)連接的輔助表。
需要使用UNION all合并上邊3個(gè)查詢,然后用select從遞歸輸出中得到最終的結(jié)果。
大體上如下形式
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:為初始化表,這里需要定義初始化的一些行,也就是你遞歸的出發(fā)點(diǎn),或者說父行,這部分邏輯只執(zhí)行一次,它的結(jié)果作為虛擬表遞歸的初始化內(nèi)容。
@2:這里必須用UNION all
@3:這里需要定義遞歸的條件(輔助表),這里定義遞歸的邏輯,需要注意的是父行和子行進(jìn)行連接的時(shí)候邏輯一定要清楚父子關(guān)系,不然很容易變成死循環(huán)的,這里首先將初始化表的結(jié)果作為條件進(jìn)行查詢,在把執(zhí)行的結(jié)果添加到虛擬表中,只要這里能查詢出來(lái)記錄,那么就會(huì)進(jìn)行下一步遞歸循環(huán)。
@4:這里就是對(duì)虛擬表的查詢語(yǔ)句。
例子:
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