SELECT NAME FROM EMP GROUP BY NAME 僅返回分組列,如何同時顯示每組內的 ID 列表?
LISTAGG(標準、推薦)SELECT NAME, LISTAGG(ID, ',') WITHIN GROUP (ORDER BY ID) AS ids
FROM EMP
GROUP BY NAME;
ON OVERFLOW TRUNCATE)。WM_CONCAT(非官方、隱含)SELECT NAME, WM_CONCAT(ID) AS ids
FROM EMP
GROUP BY NAME;
ORDER BY、返回 CLOB 需轉換、未來版本可能移除。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~11g | LISTAGG | 同 |
| 10g/11g | WM_CONCAT | 僅簡單拼接,注意遷移風險 |
| 9i 或跨版本 | SYS_CONNECT_BY_PATH | 純 SQL,無隱含依賴 |
Oracle 分組顯示組內其他列,首選 LISTAGG**(現代版本),舊版本可用 WM_CONCAT 但需規劃遷移。複雜排序/去重場景直接用 LISTAGG 參數即可滿足。