You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:32:35