0

我需要在 Oracle SQL 中组合多行,但无法访问 LISTAGG 或 wm_concat(EVALUATE_AGGR 已禁用)。

注意:我需要它才能在 Oracle OBIEE 11.1.1.9 中工作。

非常感谢任何帮助或提示。

4

1 回答 1

3

啊。我讨厌把这个写成答案,但我发现sys_connect_by_pathOracle-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
于 2017-03-03T14:06:19.920 回答