首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Oracle 分組後顯示組內其他列:WM_CONCAT / LISTAGG 聚合函數

     編輯:程式設計疑難解答

需求

SELECT NAME FROM EMP GROUP BY NAME 僅返回分組列,如何同時顯示每組內的 ID 列表?

解決方案

1. Oracle 11gR2+:LISTAGG(標準、推薦)

SELECT NAME, LISTAGG(ID, ',') WITHIN GROUP (ORDER BY ID) AS ids
FROM EMP
GROUP BY NAME;
  • 支援排序、分隔符自定義、無長度限制(超過 4000 需 ON OVERFLOW TRUNCATE)。

2. Oracle 10g/11g:WM_CONCAT(非官方、隱含)

SELECT NAME, WM_CONCAT(ID) AS ids
FROM EMP
GROUP BY NAME;
  • 不支援 ORDER BY、返回 CLOB 需轉換、未來版本可能移除。

3. 通用方案:SYS_CONNECT_BY_PATH + 層次查詢(兼容所有版本)

SELECT NAME, 
       LTRIM(MAX(SYS_CONNECT_BY_PATH(ID, ',')), ',') AS ids
FROM (
    SELECT NAME, ID,
           ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY ID) AS rn,
           COUNT(*) OVER (PARTITION BY NAME) AS cnt
    FROM EMP
)
WHERE rn = cnt
GROUP BY NAME
CONNECT BY PRIOR NAME = NAME AND PRIOR rn = rn - 1
START WITH rn = 1;

選擇建議

版本推薦函數備註
12c+LISTAGG標準 SQL,功能最全
11gR2~11gLISTAGG同
10g/11gWM_CONCAT僅簡單拼接,注意遷移風險
9i 或跨版本SYS_CONNECT_BY_PATH純 SQL,無隱含依賴

總結

Oracle 分組顯示組內其他列,首選 LISTAGG**(現代版本),舊版本可用 WM_CONCAT 但需規劃遷移。複雜排序/去重場景直接用 LISTAGG 參數即可滿足。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved