日期:2014-05-16  浏览次数:20488 次

关于oracle合并行的一个小记录 (转)

转自 :http://www.ll19.com/log/2010/06/04/115.html

?

一个工作中遇到的ORACLE合并行,对合并结果排序的记录。本来简单的认为使用wmsys.wm_concat函数就行,结果出了一些小问题,解决起来还是挺折腾的,认真记录一下:

表eims_gwjk_dbcb_log部分记录如下:

SELECT * FROM eims_gwjk_dbcb_log t

?

注意选中的几行。现在想以WFID为准进行合并行的操作,一开始使用的是wmsys.wm_concat函数来进行合并行的操作。

SELECT t.wfid,
wmsys.wm_concat(dbcb) AS dbcb ,
wmsys.wm_concat(tacheid) AS tacheid,
wmsys.wm_concat(tacheno) AS tacheno,
wmsys.wm_concat(senduserid) AS senduserid
FROM eims_gwjk_dbcb_log t GROUP BY t.wfid;

下面是合并后的结果:

?

注意选中的行,和前面选中的四行对比。我的想法是合并行之后,合并行的字段都应该按照顺序排序。

之前选中的行:

wfid dbcb tacheid tacheno senduserid
85652 CB 0000003075 3 U75CB3
85652 CB 0000003076 2 U76CB2
85652 DB 0000003076 2 U76DB2
85652 DB 0000003075 3 U75DB3

合并之后:

wfid dbcb tacheid tacheno senduserid
85652 DB,DB,CB,CB 0000003076,0000003076,0000003075,0000003075 2,3,3,2 U76DB2,U75CB3,U75DB3,U76CB2

通过senduserid字段可以看出来(其实这个字段的值是我更改了用来检测合并之后字段顺序用的,对应了前面几个字段的值),几个合并行的字段顺序完全乱了,并没有按照预想的结果排列。

即使排序后合并:

SELECT t.wfid,
wmsys.wm_concat(dbcb) AS dbcb ,
wmsys.wm_concat(tacheid) AS tacheid,
wmsys.wm_concat(tacheno) AS tacheno,
wmsys.wm_concat(senduserid) AS senduserid