with rpl (pid, id, name) as
(
select root.pid, root.id, root.name
from regr root
where root.pid = 8
union all
select child.pid, child.id, child.name
from rpl parent, regr child
where parent.id = child.pid
)select distinct pid, id, name
from rpl
order by pid, id, name
讓我們研究這個查詢的元件:
rpl 作為乙個具有以下三列的虛擬表:pid、id 和 name。
with 子句內的第乙個 select 語句是初始化表。它只執行一次。它的結果形成虛擬表的初始內容以作為遞迴的種子。在上面的示例中,種子是 pid 為 8 的一行或多行。
第二個 select 語句執行多次。將種子作為輸入(join 中的輔助表)傳遞給第二個 select 語句以產生下乙個行集合。將 join 的結果新增(union all)到虛擬表的當前內容中,並放回到其中以形成用於下一次傳遞的輸入。只要有行產生,這個過程就會繼續。
如果期望,虛擬表上最後的 select 允許我們選擇遞迴查詢所產生的所有行或僅部分行。
db2 with語法和遞迴
create table someplace id integer notnull primary key,parentid int,name varchar 100 insert into someplace values 001,null,陝西省 insert into someplace va...
DB2 With 拆分字串
假設存在表 學生和班級的關係 但是由於表結構的設計的問題,學生的資料的存放是將學生的id用 分隔連線起來存在在資料庫中的,如下圖 班級c1中存在著10個學生,studentdids 列中存的是這10個學生的id,並以逗號分隔。但是由於效率問題,要更改該錶,將每個學生的所在班級的資訊分開存放,clas...
DB2遞迴查詢
遞迴 sql 在 db2 中通過公共表表示式 cte,common table expression 來實現。遞迴 sql 由遞迴 cte 以及對遞迴 cte 結果的查詢組成。那什麼是遞迴 cte 呢?簡言之,如果 cte 中的 fullselect 在 from 子句中引用到 cte 本身,就是遞...