【问题标题】:How to combine multiple rows in Oracle SQL (having multiple limitations)如何在 Oracle SQL 中合并多行(有多重限制)
【发布时间】:2017-03-03 11:37:04
【问题描述】:

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

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

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

【问题讨论】:

  • Various techniques are shown heresys_connect_by_path 可能是一个起点,因为您已经对它们进行了排名。
  • 谢谢。我已经看到了,但是没有启用 LISTAGG、wm_concat 和 COLLECT,而且我无权编写自己的函数。好的:也许我可以让 sys_connect_by_path 工作
  • @delica 这是要进入 OBIEE 中的直接数据库请求吗?或者您打算尝试将其纳入 RPD?
  • @delica - 这是第一个想法:尝试connect_by_path 方法。
  • @RobinMoffatt 不能使用 RPD 或 DDR。无论我使用什么,都必须通过列公式和/或子查询来完成。

标签: oracle obiee string-aggregation


【解决方案1】:

呃。我讨厌写这个作为答案,但我发现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 威廉·罗伯逊网站:http://www.williamrobertson.net/documents/one-row.html

Oracle-Base 上的解决方案在只需要一次时使用两次对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

【讨论】:

  • 好点。现在我检查一下,我是在 2004 年写的,我不知道 ltrim-1 是干什么用的。
  • @WilliamRobertson - 修复它永远不会太晚!如您所见,人们仍然会使用它(有一个很好的理由:当人们无法使用 LISTAGG 等更新的工具时,这是正确的答案)。
  • 别担心,我会复制你的版本:)
  • 非常感谢您花时间查找并重新编写代码来帮助我。我现在不在工作,所以不能尝试,但会在星期一这样做。请注意,我既不能使用 RPD,也不能发出直接数据库请求,因此无论我使用什么解决方案,都必须通过 OBIEE 中的列公式、子查询、过滤器等来完成。 @威廉罗伯逊
  • 你知道我怎么能在你的代码给出这样的限制?
猜你喜欢
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
相关资源
最近更新 更多