呃。我不喜欢把它写成答案,但我发现Oracle-Base(请参阅Alex Poole的评论)和William Robertson的网站(引用Oracle-Base文章)中的解决方案并不完美,将不适合评论。
Oracle的基本环节:https://oracle-base.com/articles/misc/string-aggregation-techniques#row_number 威廉·罗伯逊网站:http://www.williamrobertson.net/documents/one-row.html
在甲骨文基本的解决方案使用两个调用row_number()
只需要一个时,它使用汇总查询,而不是connect_by_isleaf
。也许这是William最初发布的解决方案,但他的页面目前有更好的解决方案,只需使用一个row_number()
调用和connect_by_isleaf
而不是聚合。
但是,在William的页面上,他使用ltrim()
而没有显示要修剪哪个字符的参数,所以实际上它没有效果。并且他从row_number()
的值中减去1,所以在结果中,每个逗号分隔列表中的第一个标记被省略。
这里是更正的解决方案 - 供参考;我声称对此没有任何独创性。插图在标准SCOTT
模式的EMP
表中运行。
select deptno
, ltrim(sys_connect_by_path(ename,','), ',') as name_list
from (select deptno
, ename
, row_number() over (partition by deptno order by ename) as seq
from emp)
where connect_by_isleaf = 1
connect by seq = prior seq + 1 and deptno = prior deptno
start with seq = 1;
DEPTNO NAME_LIST
------ ------------------------------------
10 CLARK,KING,MILLER
20 ADAMS,FORD,JONES,SCOTT,SMITH
30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
[各种技术显示在这里](https://oracle-base.com/articles/misc/string-aggregation-techniques)。 'sys_connect_by_path'可能是一个开始的地方,因为你已经对它们进行了排名。 –
谢谢。我已经看到这个,但LISTAGG,wm_concat和COLLECT没有启用,我没有权限写自己的函数。 好的:也许我可以让sys_connect_by_path工作 – delica
@delica这是要进入OBIEE的直接数据库请求吗?或者你将尝试将其加入RPD中? –