oracle wm_concat函数按顺序中断?

时间:2017-05-29 16:29:02

标签: oracle

我的查询如下:

select country, WM_CONCAT(name)
  from (select name, country
          from (select 3 position, 'alice' name, 'usa' country
                  from dual
                union
                select 1 position, 'bob' name, 'usa' country
                  from dual
                union
                select 2 position, 'steve' name, 'usa' country
                  from dual)
         order by position asc)
group by country

我想要

usa bob,steve,alice
然而,我得到了

usa bob,alice,steve

对此的任何帮助都会很棒,所以提前感谢任何回复

2 个答案:

答案 0 :(得分:1)

据我所知,在Oracle中,内部查询中的order by没有实际意义。由于无法保证外部查询将以相同的顺序使用/显示数据。

此外,建议不要使用WM_CONCAT,因为它已从12c开始删除。参考提供URL。

http://psoug.org/definition/wm_concat.htm

  

WM_CONCAT没有文档记录且不受Oracle支持,这意味着它应该   不能用于生产系统。 LISTAGG功能,可以   产生与WM_CONCAT相同的输出,记录和支持   由Oracle。

使用LISTAGG

可以轻松实现您的目标
select country,
listagg(name,',') within group (order by position) as name from
               (select 3 position, 'alice' name, 'usa' country  from dual
                union
                select 1 position, 'bob' name, 'usa' country  from dual
                union
                select 2 position, 'steve' name, 'usa' country from dual)
group by country;

答案 1 :(得分:0)

未经测试(因为我在Oracle 12.1上,其中WM_CONCAT不再存在,记录或以其他方式存在),但是:

  • 从子查询中删除ORDER BY子句;就像你看到自己一样 无论如何都没有帮助
  • 使用WM_CONCAT的完整语法:wm_concat(name) over (order by position)

更好:根本不使用WM_COMCAT;有更好的方法。使用哪种“更好的方法”取决于您的Oracle版本,当您在Stack Overflow或任何其他讨论板上发布此类问题时,您应该始终说明这一点。

顺便说一句,养成使用union all而不是union的习惯,特别是当您像往常一样动态创建数据时。当没有重复时,结果是相同的(当有,你可能想要union all的结果),union all更快,有时更快,因为union有很多工作要做,以防止结果集中的重复。