这是样例表格数据
Fruit Number
Apple 1
Apple 2
Apple 3
Kiwi 6
Kiwi 10
我尝试将表格列的值连接起来,以获得以下结果。
Fruit Number
Apple 1-2-3
Kiwi 6-10
有没有办法查询这个存储过程?类似于按照分区连接,我对存储过程了解不多。谢谢!
这是样例表格数据
Fruit Number
Apple 1
Apple 2
Apple 3
Kiwi 6
Kiwi 10
Fruit Number
Apple 1-2-3
Kiwi 6-10
你不需要存储过程来实现这个功能。使用listagg
函数:
select fruit, listagg(number, ',') within group (order by number)
from mytable
group by fruit
WM_CONCAT
函数即可(如果不认识这个名称,请尝试使用WMSYS.WM_CONCAT
),具体示例可以参考这个答案。如果你需要使用与,
不同的分隔符,请将结果包装在replace
函数中;如果你想对结果进行排序,请在子查询中预先对其进行排序,例如:select fruit, replace(wm_concat(number), ',', '-')
from (select fruit, number
from mytable
order by number)
group by fruit
10g
版本,而LISTAGG
函数并不支持该版本,因为它是在11gR2
中引入的。在10g
中提供了一个替代方案,可以使用ROW_NUMBER()
和SYS_CONNECT_BY_PATH
函数来实现。 - Lalit Kumar Bwm_concat
函数也可以实现此功能,而无需进行不必要的递归查询。例如,请参见此答案https://dev59.com/-FTTa4cB1Zd3GeqPqj1P#4970624 - smnbbrvWM_CONCAT
,因为它是一个未记录的功能,并且在Oracle 12c中完全被删除**。不要仅仅依赖于他人的答案,而是请花些时间学习和理解事实。请参阅为什么不在Oracle中使用WM_CONCAT函数? - Lalit Kumar Bwm_concat
的方法,这对于12c是可接受的。因此,我依赖事实和我的答案,我真的花了很多时间学习和理解事实,尽管像你这样的人在开始评论之前甚至不能读完帖子。 - smnbbrvOP正在使用Oracle 10g,而LISTAGG是在11g Release 2中引入的。
因此,在不支持LISTAGG的11g之前的Oracle版本中,您可以使用ROW_NUMBER()和SYS_CONNECT_BY_PATH函数。
SELECT fruit,
LTRIM(MAX(SYS_CONNECT_BY_PATH(number,','))
KEEP (DENSE_RANK LAST ORDER BY curr),',') AS fruits_agg
FROM (SELECT fruit,
number,
ROW_NUMBER() OVER (PARTITION BY fruit ORDER BY number) AS curr,
ROW_NUMBER() OVER (PARTITION BY fruit ORDER BY number) -1 AS prev
FROM table_name)
GROUP BY fruit
CONNECT BY prev = PRIOR curr AND fruit = PRIOR fruit
START WITH curr = 1;
注意:
永远不要使用WM_CONCAT
,因为它是一个未记录的功能,已从12c版本中移除。
任何依赖于wm_concat
函数的应用程序一旦升级到12c
版本后将无法工作,因为该函数已被移除。请参阅为什么不在Oracle中使用WM_CONCAT函数?
SQL> select banner from v$version where rownum = 1;
BANNER
----------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
SQL> SELECT object_name
2 FROM dba_objects
3 WHERE owner='WMSYS'
4 AND object_name LIKE 'WM\_%' ESCAPE '\';
OBJECT_NAME
----------------------------------------------------------------------------
WM_REPLICATION_INFO
WM_RDIFF
WM_PERIOD
WM_PERIOD
WM_OVERLAPS
WM_MEETS
WM_LESSTHAN
WM_LDIFF
WM_INTERSECTION
WM_INSTALLATION
WM_GREATERTHAN
WM_EVENTS_INFO
WM_ERROR
WM_ERROR
WM_EQUALS
WM_DDL_UTIL
WM_DDL_UTIL
WM_CONTAINS
WM_COMPRESS_BATCH_SIZES
WM_COMPRESSIBLE_TABLES
20 rows selected.
SQL>
SQL> SELECT banner FROM v$version;
BANNER
----------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
PL/SQL Release 12.1.0.1.0 - Production
CORE 12.1.0.1.0 Production
TNS for 64-bit Windows: Version 12.1.0.1.0 - Production
NLSRTL Version 12.1.0.1.0 - Production
SQL> SELECT deptno, wm_concat(ename) FROM emp;
SELECT deptno, wm_concat(ename) FROM emp
*
ERROR at line 1:
ORA-00904: "WM_CONCAT": invalid identifier
LISTAGG
从11g版本开始提供。否则,请在Google上搜索Oracle中的字符串聚合技术。 - Lalit Kumar BLISTAGG
,因为它是在11gR2中引入的。 - Lalit Kumar B