db2中的with,代替oracle中的start with ...... connect by

DB2 WITH
2007年11月07日 星期三 18:19

create table regr (pid integer,id integer, name char(20))
alter table regr alter id set not null add primary key(id)
insert into regr values(-1,1,'library'),(1,2,'news'),(2,3,'world news'),(2,4,'politics'),(2,5,'bussiness'),(2,6,'science'),(2,7,'technology'),(1,8,'sports'),(8,9,'local'),(8,10,'collegiate'),(8,11,'professional'),(9,12,'soccer'),(10,13,'soccer'),(11,14,'soccer'),(9,15,'football'),(10,16,'football'),(11,17,'football')

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 允许我们选择递归查询所产生的所有行或仅部分行。

 

 

 

 

 strSQL = " WITH RPL (n_id, n_projectsort, s_code) AS ";      
   strSQL = strSQL + " ( ";
   strSQL = strSQL + " SELECT ROOT.n_id, ROOT.n_projectsort, ROOT.s_code ";   
   strSQL = strSQL + " FROM js_itemsetting ROOT ";      
   strSQL = strSQL + " WHERE ROOT.n_projectsort = 0  ";
   strSQL = strSQL + " UNION ALL   ";   
   strSQL = strSQL + " SELECT CHILD.n_id,CHILD.n_projectsort,CHILD.s_code ";
   strSQL = strSQL + " FROM RPL PARENT, js_itemsetting CHILD ";
   strSQL = strSQL + " WHERE PARENT.n_id = CHILD.n_projectsort ";
   strSQL = strSQL + " ) ";
   strSQL = strSQL + " select * from js_itemsetting aa, RPL rpl where  aa.n_id = rpl.n_id and aa.n_rdstatus = ? ";

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值