设为首页 收藏本站
查看: 1246|回复: 0

[经验分享] DB2递归实现字符串分组连接操作

[复制链接]

尚未签到

发表于 2016-11-17 00:12:21 | 显示全部楼层 |阅读模式
DB2递归实现字符串分组连接操作
  文章转自 http://space.itpub.net/23239992
  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:这里就是对虚拟表的查询语句。


  需求:一张实时表,一个人每到一个地方,就有一条记录存在,存放样例:
  张三 上海
  张三 杭州
  .....
  要求,按人名进行汇总,将他到过的地方拼接,中间用'#'分隔
  数据准备:
  --创建表:
  CREATE TABLE Recursive_Test
(User_Name VARCHAR(12),
 City VARCHAR(12));

  --数据插入
  INSERT INTO Recursive_Test(User_Name,City)
      values ('张三','杭州'),('张三','郑州'),('李四','杭州'),
             ('张三','南昌'),('李四','广州'),('王五','北京');
  -----递归实现:
  WITH Recursive_Test_Par(User_Name,City,Rk_Num) as(
SELECT User_Name,City,ROW_NUMBER() OVER(PARTITION BY User_Name) --分组,生成序列,自我关联之用
FROM Recursive_Test
),
City_Join(User_Name,City,R_Num) as(
SELECT User_Name,CAST(City AS VARCHAR(100)),Rk_Num from Recursive_Test_Par WHERE Rk_Num=1
UNION ALL
SELECT a1.User_Name,CAST(a1.City||'#'||b1.City AS VARCHAR(100)),a1.R_Num+1
  from City_Join a1,Recursive_Test_Par b1
WHERE a1.User_Name=b1.User_Name and a1.R_Num=b1.Rk_Num-1

SELECT a.User_name,a.City FROM City_Join a INNER JOIN
      (SELECT User_Name,max(R_Num) R_Num from City_Join
       GROUP BY User_Name) b
ON a.User_name=b.User_name and a.R_Num=b.R_Num;
 --结果:
  王五
北京
李四
杭州#广州
张三
杭州#郑州#南昌

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-301188-1-1.html 上篇帖子: DB2中文字段在C程序中的乱码问题 下篇帖子: [转]IBM DB2跨平台数据库迁移步骤和注意事项
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表