如何解决SQL子查询返回多行(subquery returns more than 1 row)错误
解决SQL子查询返回多行的错误
首先,这个subquery returns more than 1 row错误逻辑很明确——你的两个SELECT子查询里,至少有一个返回了多条结果,但外层查询期望每个主查询行只对应一个子查询结果值。
看你的SQL片段,问题出在这两个子查询上:
- 第一个子查询:
(SELECTinv_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
相关产品推荐
相关产品推荐

