Oracle 11g 有一个简洁的函数 LISTAGG,这几乎正是您想要的,但是由于您使用的是 10g,所以您无法使用该函数(除非您决定升级)。
如果出于某种原因您不希望(或由于任何原因不能)升级到 11g,我建议您查看 10g 上可用的 LISTAGG 的一些替代方案。
您可以查看一些建议的替代方案here
快速调整建议的替代方案之一以适应您的案例场景:
WITH Q AS
(
SELECT 'North' POD, 'Rony' NAME FROM DUAL UNION ALL
SELECT 'North', 'James' FROM DUAL UNION ALL
SELECT 'North', 'Aby' FROM DUAL UNION ALL
SELECT 'South', 'Sam' FROM DUAL UNION ALL
SELECT 'South', 'Willy' FROM DUAL UNION ALL
SELECT 'West', 'Mike' FROM DUAL
)
SELECT POD,
RTRIM(
XMLAGG (XMLELEMENT(e, name||',') ORDER BY name).EXTRACT('//text()'),
','
) AS name
FROM q
GROUP BY POD;
但请记住,这不是实际的解决方案,因为您必须根据您的表(而不是虚拟 DUAL 表)等对其进行定制...
您的解决方案可能看起来类似于:
SELECT POD,
RTRIM(
XMLAGG (XMLELEMENT(E, NAME||',') ORDER BY NAME).EXTRACT('//text()'),
','
) AS NAME
FROM tbl1
GROUP BY POD;
如果你想改变分隔符,你可以在这部分中用逗号来改变它:
(E, NAME||',')
RTRIM 只是为了从连接字符串的末尾剪掉尾随逗号,如果您不被尾随逗号打扰,您可以省略 RTRIM 函数以保持可读性。