2017-05-29 135 views
0

我的查詢就像如下:oracle wm_concat函數按順序排序?

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

您使用的是哪個版本的Oracle?從Oracle 11.2開始,您可以使用LISTAGG(請參閱Utsav的答案);對於早期版本,還有其他方法,例如在分層查詢中使用SYS_CONNECT_BY_PATH,而不需要未記錄的WM_CONCAT函數。 – mathguy

回答

1

據我所知,在Oracle中,內部查詢中的是沒有意義的。由於不能保證外部查詢將以相同的順序使用/顯示數據。

另外它不建議使用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; 
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有很多工作要做,以防止重複結果集。