Oracle SQL如何将同一ID下的所有邮箱地址合并
解决Oracle同一ID下邮箱地址合并的两种方案
针对你的需求,这里提供两种常用的实现方式:
方案1:将同一ID下所有邮箱合并为单个字符串(逗号分隔)
使用Oracle内置的LISTAGG函数可以快速将多行数据合并为一行,示例如下:
SELECT E.ID, LISTAGG(G.EMAIL_ADDRESS, ', ') WITHIN GROUP (ORDER BY G.EMAIL_CODE) AS ALL_EMAILS FROM EMPLOYEE E INNER JOIN GENERAL_EMAIL G ON G.ID = E.ID GROUP BY E.ID ORDER BY E.ID;
LISTAGG(字段, 分隔符):指定要合并的字段和分隔符WITHIN GROUP (ORDER BY ...):可选,控制合并后邮箱的排序顺序
方案2:按邮箱类型分别展示为不同列(如EMAIL1、EMAIL2)
如果需要保留不同EMAIL_CODE对应的邮箱作为独立列,可以用MAX结合CASE语句,同时调整分组逻辑:
SELECT E.ID, MAX(CASE WHEN G.EMAIL_CODE = 'EMAIL' THEN G.EMAIL_ADDRESS END) AS EMAIL1, MAX(CASE WHEN G.EMAIL_CODE = 'ABCE' THEN G.EMAIL_ADDRESS END) AS EMAIL2 FROM EMPLOYEE E INNER JOIN GENERAL_EMAIL G ON G.ID = E.ID GROUP BY E.ID ORDER BY E.ID;
- 这里用
MAX聚合函数来筛选每个ID下对应类型的唯一邮箱(如果同一ID同一类型有多个邮箱,会取最大值;如果只有一个,就取对应值) - 原查询的问题在于
GROUP BY包含了G.EMAIL_CODE和G.EMAIL_ADDRESS,导致无法按ID聚合,去掉这两个字段即可实现按ID分组展示不同类型邮箱
内容的提问来源于stack exchange,提问作者LogicAndArt
相关产品推荐
相关产品推荐

