我需要在 Oracle SQL 中组合多行,但无法访问 LISTAGG 或 wm_concat(EVALUATE_AGGR 已禁用)。
注意:我需要它才能在 Oracle OBIEE 11.1.1.9 中工作。
非常感谢任何帮助或提示。
我需要在 Oracle SQL 中组合多行,但无法访问 LISTAGG 或 wm_concat(EVALUATE_AGGR 已禁用)。
注意:我需要它才能在 Oracle OBIEE 11.1.1.9 中工作。
非常感谢任何帮助或提示。
啊。我讨厌把这个写成答案,但我发现sys_connect_by_path
Oracle-Base(参见 Alex Poole 的评论)和 William Robertson 的网站(在 Oracle-Base 文章中引用)的解决方案都不够完美,这赢得了不适合发表评论。
Oracle-Base 链接:https ://oracle-base.com/articles/misc/string-aggregation-techniques#row_number William Robertson 网站: http: //www.williamrobertson.net/documents/one-row.html
row_number()
Oracle-Base 上的解决方案在只需要一个时使用两个调用,并且它使用聚合查询而不是connect_by_isleaf
. 也许这是威廉最初发布的解决方案,但他的页面目前有更好的解决方案,只使用一次row_number()
调用而connect_by_isleaf
不是聚合。
但是,在威廉的页面上,他使用ltrim()
了没有显示要修剪哪个字符的参数,因此实际上它没有效果。并且他从 的值中减去 1 row_number()
,因此结果中每个逗号分隔列表中的第一个标记都被省略了。
这是更正的解决方案 - 供参考;我声称对此没有任何独创性。插图EMP
在标准SCOTT
模式中的表上运行。
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