我的查询如下:
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
对此的任何帮助都会很棒,所以提前感谢任何回复
答案 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不再存在,记录或以其他方式存在),但是:
wm_concat(name) over (order by position)
。更好:根本不使用WM_COMCAT;有更好的方法。使用哪种“更好的方法”取决于您的Oracle版本,当您在Stack Overflow或任何其他讨论板上发布此类问题时,您应该始终说明这一点。
顺便说一句,养成使用union all
而不是union
的习惯,特别是当您像往常一样动态创建数据时。当没有重复时,结果是相同的(当有,你可能想要union all
的结果),union all
更快,有时更快,因为union
有很多工作要做,以防止结果集中的重复。