Oracle SQL多行结果合并单行 解决ORA-01427错误
解决Oracle多行结果合并与ORA-01427错误问题
针对你的需求——把多行T.TEST结果合并成单行(支持|或逗号分隔),同时解决ORA-01427: single-row subquery returns more than one row错误,你可以借助Oracle提供的字符串聚合函数来实现,下面是几种实用方案:
方案1:使用LISTAGG(推荐,Oracle 11g+)
这是Oracle官方主推的字符串聚合函数,语法灵活、性能稳定,还能自定义排序和分隔符。
用|分隔的SQL:
SELECT LISTAGG(t.test, ' | ') WITHIN GROUP (ORDER BY t.test) AS combined_test FROM device t JOIN device_interface v ON t.pe = v.end_test WHERE v.test = UPPER('IE5656') AND t.device_type LIKE '%tin%';
用逗号分隔的SQL:
SELECT LISTAGG(t.test, ', ') WITHIN GROUP (ORDER BY t.test) AS combined_test FROM device t JOIN device_interface v ON t.pe = v.end_test WHERE v.test = UPPER('IE5656') AND t.device_type LIKE '%tin%';
LISTAGG(列名, 分隔符):指定要聚合的目标列和分隔符WITHIN GROUP (ORDER BY 列名):控制合并后结果的排序顺序,可根据需求调整排序字段
方案2:使用WM_CONCAT(适用于Oracle 10g及部分11g版本)
这是Oracle早期的非官方聚合函数,虽然现在官方不再推荐,但部分旧环境仍能正常使用:
默认逗号分隔:
SELECT WM_CONCAT(t.test) AS combined_test FROM device t JOIN device_interface v ON t.pe = v.end_test WHERE v.test = UPPER('IE5656') AND t.device_type LIKE '%tin%';
改为|分隔:
SELECT REPLACE(WM_CONCAT(t.test), ',', ' | ') AS combined_test FROM device t JOIN device_interface v ON t.pe = v.end_test WHERE v.test = UPPER('IE5656') AND t.device_type LIKE '%tin%';
方案3:使用XMLAGG(兼容更低版本Oracle)
如果你的Oracle版本低于11g,也可以通过XML相关函数实现聚合需求:
SELECT RTRIM(XMLAGG(XMLELEMENT(e, t.test || ' | ', '')).EXTRACT('//text()'), ' | ') AS combined_test FROM device t JOIN device_interface v ON t.pe = v.end_test WHERE v.test = UPPER('IE5656') AND t.device_type LIKE '%tin%';
这个方法先将每个值与分隔符拼接,再通过XMLAGG聚合,最后用RTRIM去掉末尾多余的分隔符。
关于ORA-01427错误的说明
如果你的原SQL是作为子查询被其他语句调用,当子查询返回多行结果时就会触发这个错误。使用上面的聚合方法后,查询只会返回单行合并后的结果,从根源上解决了这个问题。
内容的提问来源于stack exchange,提问作者Stef
相关产品推荐
相关产品推荐

