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

如何解决SQL子查询返回多行(subquery returns more than 1 row)错误

解决SQL子查询返回多行的错误

首先,这个subquery returns more than 1 row错误逻辑很明确——你的两个SELECT子查询里,至少有一个返回了多条结果,但外层查询期望每个主查询行只对应一个子查询结果值。

看你的SQL片段,问题出在这两个子查询上:

  • 第一个子查询:(SELECT inv_lc_amend.lc_total_amountFROMinv_lc_amendWHEREinv_lc_amend.lc_no=inv_lc_details.lc_no) AS lc_amend_amount
  • 第二个子查询:(SELECT supplier_name FROM inv_supplier_details WHERE inv_supplier_details.supplier_id = inv_proforma_invoice.supplier_id) AS supplier

这说明你的数据里,存在某个lc_no对应多条inv_lc_amend记录,或者某个supplier_id对应多条inv_supplier_details记录。下面给你两种常用的解决思路:

方案一:让子查询强制返回单行

如果业务上你只需要子查询结果中的某一行(比如最新的、最大的、最小的),可以用聚合函数或者LIMIT来约束:

示例修改后的SQL

SELECT 
    `inv_lc_details`.`lc_date`, 
    `inv_lc_details`.`lc_no`, 
    `inv_lc_details`.`lc_amount`, 
    `inv_proforma_invoice`.`pi_no`, 
    `inv_proforma_invoice_sub`.`pi_goods_des`, 
    `inv_proforma_invoice_sub`.`pi_amount`, 
    -- 用MAX取最大的修改金额,也可根据业务需求用MIN/SUM等
    (SELECT MAX(`inv_lc_amend`.`lc_total_amount`) 
     FROM `inv_lc_amend` 
     WHERE `inv_lc_amend`.`lc_no` = `inv_lc_details`.`lc_no`) AS lc_amend_amount, 
    -- 用LIMIT 1取第一条供应商名称(若存在重复数据,建议先清理数据)
    (SELECT supplier_name 
     FROM inv_supplier_details 
     WHERE inv_supplier_details.supplier_id = `inv_proforma_invoice`.`supplier_id`
     LIMIT 1) AS supplier_name
-- 补充你的FROM和JOIN关联语句
FROM inv_lc_details
JOIN inv_proforma_invoice ON ... -- 填写你的表关联条件
JOIN inv_proforma_invoice_sub ON ... -- 填写你的表关联条件

注意:如果需要取最新的LC修改记录,可替换聚合函数为排序+LIMIT,比如(SELECT lc_total_amount FROM inv_lc_amend WHERE lc_no = inv_lc_details.lc_no ORDER BY amend_date DESC LIMIT 1)。

方案二:改用JOIN代替子查询

如果业务上一个主行可能对应多个子行,或者你想避免子查询的限制,改用JOIN会更灵活:

示例修改后的SQL

SELECT 
    ild.lc_date, 
    ild.lc_no, 
    ild.lc_amount, 
    ipi.pi_no, 
    ips.pi_goods_des, 
    ips.pi_amount, 
    -- 根据需求用聚合函数处理多行结果
    MAX(ila.lc_total_amount) AS lc_amend_amount, 
    isd.supplier_name
FROM inv_lc_details ild
JOIN inv_proforma_invoice ipi ON ... -- 填写你的表关联条件
JOIN inv_proforma_invoice_sub ips ON ... -- 填写你的表关联条件
-- LEFT JOIN保证即使没有修改记录,主数据也能正常显示
LEFT JOIN inv_lc_amend ila ON ila.lc_no = ild.lc_no
LEFT JOIN inv_supplier_details isd ON isd.supplier_id = ipi.supplier_id
-- 若出现重复行,通过GROUP BY去重
GROUP BY ild.lc_date, ild.lc_no, ild.lc_amount, ipi.pi_no, ips.pi_goods_des, ips.pi_amount, isd.supplier_name

额外提醒

  • 先检查数据:看看是不是有重复的supplier_id在inv_supplier_details里,或者同一个lc_no有多个inv_lc_amend记录——如果是数据错误,先清理数据比改SQL更稳妥。
  • 明确业务需求:比如对于LC修改记录,你是要所有修改的总和?还是最新的那一条?选对应的聚合函数或者排序逻辑。

内容的提问来源于stack exchange,提问作者Habibul Bashar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:04:04