Oracle_Oracle去重分组拼接字符串
要实现的是去重按顺序分组拼接字段,且输出表中需要拼接多个字段。
1、查了⽹上⼤概有四种⽅法,各有特点:
1、wmsys.wm_concat(column)
2、listagg (column,[,]) within group (order by ) [over (partition by  )]
3、sys_connect_by_path(column,<;分隔符>)
4、xmlagg (content column,[,] wellformed) within group (order by ) [over (partition by  )]
第1种,WMSYS⽤户⽤于Workspace Manager,函数对象可能因版本⽽不同,Oracle官⽅也不建议使⽤;不可指定分隔符;⽀持去重。
第2种,listagg返回结果varchar2类型(最⼤长度4000),当拼接字符串过长会提⽰“返回结果为字符串连接的结果过长”;可指定分隔符;不⽀持去重。
第3种,此⽅法未测试。
第4种,返回结果为clob(Character Large Object)类型,最⼤容量为4GB;可指定分隔符;不⽀持去重。
2、确定了使⽤第4种⽅法,发现实现难点在于分组结果去重,⼜存在多个字段需要拼接,则先去重只可针对⼀个字段,多个字段就存在问题,采⽤先产⽣针对不同字段拼接的临时表,使⽤分组字段作为连接更新到主表中。
⽹上针对xmlagg可使⽤的去重⽅法有两种,⼀种是使⽤正则表达式(适⽤于字符串⼤⼩⽐较⼩的情况,不适⽤),另⼀种是先去重再聚合。CREATE Global Temporary TABLE D302_2 ON COMMIT PRESERVE ROWS AS
SELECT SHENG,
XIAN,
XMMC,
BHYY,
BHSD,
SYLDXZ,
rtrim(xmlagg(xmlparse(content PAN_NO_TB || '、' wellformed) ORDER BY PAN_NO_TB).getclobval(),
'、') AS PAN_NO_TB
FROM (SELECT DISTINCT SHENG, XIAN, XMMC, BHYY, BHSD, SYLDXZ, PAN_NO_TB
FROM TEST
WHERE PAN_NO_TB <> 0)
GROUP BY SHENG, XIAN, XMMC, BHYY, BHSD, SYLDXZ;
from 后⾯括号内实现去重⽬的
group by 实现分组⽬的
xmlagg(xmlparse(content PAN_NO_TB || '、' wellformed) ORDER BY PAN_NO_TB) 实现拼接
getclobval() 获得clob字符串
rtrim 去除最后⾯的 "、"
注意:xmlagg字段若为字符串,需适应to_char()函数转换。
3、使⽤分组字段作为连接更新到主表中(a2,a3,a7,a8,a9,a10分别为主表的SHENG, XIAN, XMMC, BHYY, BHSD, SYLDXZ)
UPDATE D302_1
SET D302_1.a5 =
字符串函数去重(SELECT PAN_NO_TB
FROM D302_3
WHERE D302_3.sheng = D302_1.A2
AND D302_3.XIAN = D302_1.A3
AND D302_3.XMMC = D302_1.A7
AND D302_3.BHYY = D302_1.A8
AND D302_3.BHSD = D302_1.A9
AND D302_3.SYLDXZ = D302_1.A10)
WHERE EXISTS (SELECT PAN_NO_TB
FROM D302_3
WHERE D302_3.sheng = D302_1.A2
AND D302_3.XIAN = D302_1.A3
AND D302_3.XMMC = D302_1.A7
AND D302_3.BHYY = D302_1.A8
AND D302_3.BHSD = D302_1.A9
AND D302_3.SYLDXZ = D302_1.A10); WHERE EXISTS避免不匹配项被更新为空值。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。