Oracle 数据库查询结果拼接(wm_concat、listagg的使用)
碰到需要查询大量表所属数据库用户名的情况,找了下有两个函数可以使用:1. wm_concat2. listagg
·
查询结果本来是这样:
结果需要转换成:
参考csdn论坛《ORACLE SQL查询结果集怎么拼接?? 》,了解到可以使用以下两种函数:wm_concat
和 listagg
函数
1.
2. wm_concat,listagg函数都可。。。一个10g,一个11g
3. sys_connect_by_path,9i也可以用这个
我是Oracle11g,测试发现两个函数都可以适用,再次参考《oracle中listagg()和wmsys.wm_concat()基本用法》了解如何使用两个函数
如果使用listagg函数:
首先根据OWNER进行分组,然后在每个分组内 根据owner排序后的TABLE_NAME用‘,’进行拼接
SQL> L
1 select listagg(table_name,',') within group( order by owner) 所含表 ,owner from dba_tables where table_name in (
2 'DEPT','EMP','BONUS','IDL_SB4$','ERROR$','SETTINGS$'
3 )
4* group by owner
SQL> /
所含表 OWNER
--------------------------------- ------------------------------
BONUS,DEPT,EMP SCOTT
EMP,ERROR$,IDL_SB4$,SETTINGS$ SYS
而vm_concat函数:
这里不需要写拼接字段,自动填充为‘,’
SQL> select wmsys.wm_concat(table_name) 所含表 ,owner from dba_tables where table_name in (
2 'DEPT','EMP','BONUS','IDL_SB4$','ERROR$','SETTINGS$'
3 )
4 group by owner
5 /
所含表 OWNER
--------------------------------- ------------------------------
BONUS,DEPT,EMP SCOTT
SETTINGS$,EMP,IDL_SB4$,ERROR$ SYS
如果用加上 over(partition by owner)
结果如下:
当然实际项目中用到的有点不一样,需要根据表格名前3位数进行分组
查询结果如下:
更多推荐
所有评论(0)