多行并一行显示的两种方式(DB2)

前端之家收集整理的这篇文章主要介绍了多行并一行显示的两种方式(DB2)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、简介

多行并作一行显示,在此介绍两种方式CTE递归,和XML函数。表数据如下:

ID NAME HOUSE
1 张三 普通住宅
2 张三 豪华别墅
3 张三 安置房
4 李四 安置房
5 李四 普通住宅

显示的结果大约为:

NAME HOUSE
张三 普通住宅,豪华别墅,安置房
李四 安置房,普通住宅

二、CTE递归使用限制

递归查询就是通过对 CTE 自身的引用,从而启动递归逻辑的查询。递归查询需要遵循以下几个规则 :
递归查询和初始查询结果必须包含相同数量的数据列;
递归查询和初始查询结果数据列的、长度等必须一致;
递归查询不能包含 GROUP BY 或者 HAVING 子句;
递归查询不能包含 Outer Join
递归查询不能包含子查询 (Subquery);
递归查询必须用 UNION ALL 联结。

三、通过CTE递归方式

--给数据加上序号
with wa_RowNum(id,name,house,rn) as(
        select id,ROW_NUMBER() OVER(PARTITION BY name) from TTABLE
),--CTE递归拼接house,序号最大的行拼接了所有的house数据
wa_addHouse(id,rn) as(
        --1作为递归入口
        select wr.id,wr.name,CAST(wr.house AS CLOB),wr.rn from wa_RowNum wr where wr.rn=1
        UNION ALL
        select nt.id,nt.name,CAST(self.house||';'||nt.house AS CLOB),self.rn+1
                from wa_addHouse self,wa_RowNum nt where nt.name=self.name and self.rn+1=nt.rn
),--过滤掉不需要的数据
wa_getMax(name,house) as(
select name,VARCHAR(house) from wa_addHouse wa where wa.rn in(select max(iwa.rn) from wa_addHouse iwa where iwa.name=wa.name)
)
select * from wa_getMax
 
/*

四、XML函数方式

select * from wa_getMax;
select name,varchar(replace(replace(replace(xml2clob(xmlagg(xmlelement(NAME a,house||','))),'<A>',''),'</A>','<A/>',''))
from TTABLE group by name
原文链接:/xml/299922.html

猜你在找的XML相关文章