Sql 如何在Oracle10g中按顺序连接多行
如果我有这样的数据:Sql 如何在Oracle10g中按顺序连接多行,sql,oracle,oracle10g,string-aggregation,wm-concat,Sql,Oracle,Oracle10g,String Aggregation,Wm Concat,如果我有这样的数据: GROUP | SEQUENCE | COMMAND ------------------------------ ONE | 3 | <message2>MESSAGE</message2> ONE | 1 | <?xml version="1.0" encoding="UTF-8"?> ONE | 2 | <message1>MESSAG
GROUP | SEQUENCE | COMMAND
------------------------------
ONE | 3 | <message2>MESSAGE</message2>
ONE | 1 | <?xml version="1.0" encoding="UTF-8"?>
ONE | 2 | <message1>MESSAGE</message1>
TWO | 2 | <message2>MESSAGE</message2>
TWO | 1 | <?xml version="1.0" encoding="UTF-8"?>
........
TWO | 10 | <message9>MESSAGE</message9>
GROUP | COMMAND
-----------------
ONE | <?xml version="1.0" encoding="UTF-8"?>,<message1>MESSAGE</message1>,<message2>MESSAGE</message2>
TWO | <?xml version="1.0" encoding="UTF-8"?>,<message1>MESSAGE</message1>, .. ,<message9>MESSAGE</message9>
如有任何意见和建议,将不胜感激^_^ 切勿使用
WM\u CONCAT
。阅读
参见本主题
它没有文档记录,任何依赖于WM_CONCAT
的应用程序在升级到12c
后将无法工作,因为它已从最新的12c版本中删除
根据数据库版本的不同,进行字符串聚合的方法有很多。见以下几个例子:
11gR2
使用LIASTAGG
:
SQL> SELECT grp,
2 listagg(command, ',') WITHIN GROUP(
3 ORDER BY seq) command
4 FROM t
5 GROUP BY grp;
GRP COMMAND
--- --------------------------------------------------------------------------------------------
ONE <?xml version=1.0 encoding=UTF-8?>,<message1>MESSAGE</message1>,<message2>MESSAGE</message2>
TWO <?xml version=1.0 encoding=UTF-8?>,<message2>MESSAGE</message2>,<message9>MESSAGE</message9>
SQL>
您好,先生,我在执行过程中遇到了这个错误“ORA-00923:FROM关键字未在预期位置找到”。Oracle10g是否支持Listag?Oracle10g中是否有其他连接解决方案@LalitKumarBOk,请参阅更新的答案。使用
ROW\u NUMBER()
和SYS\u CONNECT\u BY\u PATH
。再次感谢您的快速响应。:)@不客气!很高兴我能在第二个主题上帮助您;-)
SQL> SELECT grp,
2 listagg(command, ',') WITHIN GROUP(
3 ORDER BY seq) command
4 FROM t
5 GROUP BY grp;
GRP COMMAND
--- --------------------------------------------------------------------------------------------
ONE <?xml version=1.0 encoding=UTF-8?>,<message1>MESSAGE</message1>,<message2>MESSAGE</message2>
TWO <?xml version=1.0 encoding=UTF-8?>,<message2>MESSAGE</message2>,<message9>MESSAGE</message9>
SQL>
SQL> SELECT grp,
2 LTRIM(MAX(SYS_CONNECT_BY_PATH(command,','))
3 KEEP (DENSE_RANK LAST ORDER BY seq),',') command
4 FROM (SELECT grp,
5 command,
6 seq,
7 ROW_NUMBER() OVER (PARTITION BY grp ORDER BY seq) AS curr,
8 ROW_NUMBER() OVER (PARTITION BY grp ORDER BY seq) -1 AS prev
9 FROM t)
10 GROUP BY grp
11 CONNECT BY prev = PRIOR curr AND grp = PRIOR grp
12 START WITH curr = 1;
GRP COMMAND
--- --------------------------------------------------------------------------------------------
ONE <?xml version=1.0 encoding=UTF-8?>,<message1>MESSAGE</message1>,<message2>MESSAGE</message2>
TWO <?xml version=1.0 encoding=UTF-8?>,<message2>MESSAGE</message2>,<message9>MESSAGE</message9>
SQL>