zzq230 发表于 2013-1-13 19:00:55

db2 with递归语句

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 允许我们选择递归查询所产生的所有行或仅部分行。
 
页: [1]
查看完整版本: db2 with递归语句