Oracle 一个查询中的两个wm_concat
考虑以下表格:Oracle 一个查询中的两个wm_concat,oracle,oracle10g,Oracle,Oracle10g,考虑以下表格: TABLE DB.TEMP_TABLE ------------------------------------------ field1 field2 field3 ------------------------------------------ 1 10 100 1 20 200 1 30
TABLE DB.TEMP_TABLE
------------------------------------------
field1 field2 field3
------------------------------------------
1 10 100
1 20 200
1 30 300
1 40 400
2 10 100
2 20 200
我需要在field1
的基础上连接field2
和field3
。期望的结果应该是这样的-
DESIRED RESULT
------------------------------------------
field1 field2 field3
------------------------------------------
1 10,20,30,40 100,200,300,400
2 10,20 100,200
下面给出了我用于此查询的查询-
SELECT field1,
wm_concat(field2),
wm_concat(field3)
FROM temp_table
GROUP BY field1;
这是我得到的结果-
------------------------------------------
field1 field2 field3
------------------------------------------
1 10,20,40,30 100,400,300,200
2 10,20 100,200
请向我提出一个工作问题,如果可能,请解释这种行为
我正在使用Oracle 10g,并且也尝试过使用
xmlagg
wm_concat
未被Oracle记录/支持,因此无法保证它将来会出现。您可以为此使用子查询。如果您喜欢使用函数,可以创建自己的函数,并使用类似于wm_concat
的函数 您可以使用SYS_CONNECT_BY_PATH或XMLAGG作为WM_CONCAT的替代方案(不支持)。Oracle论坛讨论中提供了SYS_CONNECT_BY_PATH的示例。我使用XMLAGG创建了一个SQL FIDLE
此外,如果需要按特定顺序连接值,可以使用ORDERBY子句(如示例所示)
参考资料:
正如我已经提到的,我也使用了
xmlagg
,但仍然得到相同的结果。好的,实现您自己的函数。我提到的链接为您完成了大部分工作。@RacilHilanwm_concat
确实已从12c中删除。这有点令人惊讶,我认为现在的wm_concat是某种普通法的特征。@jonearles是的,你说得对,就像“普通法”一样,你不需要离婚来结束它;),这就是12c所做的。根据你的小提琴,字段总是被排序的。考虑诸如“代码> 1”、“20”、“300”/“代码>和<代码> 1×30×200 <代码>等条目。这种情况下的结果将是1 | 20,30 | 200300
。所需的是1 | 20,30 | 300200
。我知道你希望第三场和第二场的顺序相同。因此,我将fiddle()修改为按field2顺序排列field3。