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 飛熊 閱讀(818) 評論(0) 編輯 收藏 所屬分類: DataBase