如何在Oracle SQL中组合多行(有多个限制)
我需要合并Oracle SQL中的多行,但无法访问LISTAGG或wm_concat(已禁用EVALUATE_AGGR) 注意:我需要它在Oracle OBIEE 11.1.1.9中工作如何在Oracle SQL中组合多行(有多个限制),oracle,obiee,string-aggregation,Oracle,Obiee,String Aggregation,我需要合并Oracle SQL中的多行,但无法访问LISTAGG或wm_concat(已禁用EVALUATE_AGGR) 注意:我需要它在Oracle OBIEE 11.1.1.9中工作 感谢所有的帮助或提示。啊。我不喜欢将此作为答案,但我发现无论是在Oracle Base(见Alex Poole的评论)还是在William Robertson的网站(在Oracle Base文章中引用)上的sys\u connect\u by\u path解决方案都不够完美,这不适合评论 Oracle基本链接:
感谢所有的帮助或提示。啊。我不喜欢将此作为答案,但我发现无论是在Oracle Base(见Alex Poole的评论)还是在William Robertson的网站(在Oracle Base文章中引用)上的
sys\u connect\u by\u path
解决方案都不够完美,这不适合评论
Oracle基本链接:
威廉·罗伯逊网站:
Oracle Base上的解决方案在只需要一个时使用两个调用row\u number()
,并使用聚合查询而不是connect\u by\u isleaf
。也许这是William最初发布的解决方案,但他的页面目前有更好的解决方案,只使用一个row\u number()
call和connect\u by\u isleaf
,而不是聚合
然而,在William的页面上,他使用了ltrim()
,没有显示要修剪哪个字符的参数,因此实际上没有效果。他从行数()的值中减去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
啊。我不喜欢将此作为答案,但我发现无论是在Oracle Base(见Alex Poole的评论)还是在William Robertson的网站(在Oracle Base文章中引用)上的sys\u connect\u by\u path
解决方案都不够完美,这不适合评论
Oracle基本链接:
威廉·罗伯逊网站:
Oracle Base上的解决方案在只需要一个时使用两个调用row\u number()
,并使用聚合查询而不是connect\u by\u isleaf
。也许这是William最初发布的解决方案,但他的页面目前有更好的解决方案,只使用一个row\u number()
call和connect\u by\u isleaf
,而不是聚合
然而,在William的页面上,他使用了ltrim()
,没有显示要修剪哪个字符的参数,因此实际上没有效果。他从行数()的值中减去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
. sys\u connect\u by\u path
one可能是一个起点,因为您已经对它们进行了排名。谢谢。我已经看到了这一点,但是Listag、wm_concat和COLLECT没有启用,我没有权限编写自己的函数。好的:也许我可以让系统通过路径连接到work@delica这是进入OBIE中的直接数据库请求吗?或者你要尝试将其放入RPD?@delica-这是第一个想法:尝试connect\u by\u path
方法。@RobinMoffatt不能使用RPD或DDR。无论我使用什么,都必须通过列公式和/或子查询来完成。。sys\u connect\u by\u path
one可能是一个起点,因为您已经对它们进行了排名。谢谢。我已经看到了这一点,但是Listag、wm_concat和COLLECT没有启用,我没有权限编写自己的函数。好的:也许我可以让系统通过路径连接到work@delica这是进入OBIE中的直接数据库请求吗?或者你要尝试将其放入RPD?@delica-这是第一个想法:尝试connect\u by\u path
方法。@RobinMoffatt不能使用RPD或DDR。无论我使用什么,都必须通过列公式和/或子查询来完成。很好。现在我检查一下,我是在2004年写的,我不知道ltrim
或-1
是做什么用的。@WilliamRobertson-修复它永远不会太晚!正如您所看到的,人们仍然会使用它(有一个很好的理由:当人们不能使用像Listag这样的最新工具时,这是正确的答案)。别担心,我将复制您的版本:)非常感谢您花时间查找它并重新编写代码来帮助我。我现在不在工作,所以不能尝试,但会在周一这样做。请注意,我既不能使用RPD,也不能发出直接数据库请求,因此我使用的任何解决方案都必须通过OBIEE中的列公式、子查询、过滤器等来完成@WilliamRobertsonDo你知道在这样的限制下我怎么能修改你的代码吗?很好。现在我检查一下,我是在2004年写的,我不知道ltrim
或-1
是做什么用的。@WilliamRobertson-修复它永远不会太晚!正如您所看到的,人们仍然会使用它(有一个很好的理由:当人们不能使用像Listag这样的最新工具时,这是正确的答案)。别担心,我将复制您的版本:)非常感谢您花时间查找它并重新编写代码来帮助我。我现在不在工作,所以不能尝试,但会在周一这样做。请注意,我既不能使用RPD,也不能发出直接数据库请求,因此我使用的任何解决方案都必须通过OBIEE中的列公式、子查询、过滤器等来完成@WilliamRobertsonDo你知道在这样的限制下我怎么能修改你的代码吗?