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

如何在SQL JOIN中执行算术运算并修复单行子查询返回多行错误?

问题修复方案

错误原因

你遇到的single-row subquery returns more than one row错误,是因为WHERE子句里用=和一个返回多行结果的子查询做比较——=只能匹配单个值,子查询返回多个值就会触发报错。同时你的SQL逻辑本身存在偏差:你拿订单里的折扣后单价去和所有行的原价做对比,这和“找出采用最高无折扣单价的产品”的需求不匹配。

正确思路与修复写法

核心逻辑是:先计算每个订单明细的无折扣单价(原价),找到所有订单中该单价的最大值,最后筛选出原价等于这个最大值的产品,同时展示指定字段。

写法一:子查询获取最高原价(兼容性强)

SELECT 
    p.productid, 
    p.productname, 
    (od.unitprice / (1 - od.discount)) AS unitprice
FROM products p
INNER JOIN orderdetails od ON p.productid = od.productid
WHERE (od.unitprice / (1 - od.discount)) = (
    SELECT MAX(unitprice / (1 - discount)) 
    FROM orderdetails
);

写法二:窗口函数(适合MySQL 8+、PostgreSQL、SQL Server等支持窗口函数的数据库)

SELECT DISTINCT
    p.productid, 
    p.productname, 
    od.calculated_unitprice AS unitprice
FROM products p
INNER JOIN (
    SELECT 
        productid, 
        (unitprice / (1 - discount)) AS calculated_unitprice,
        MAX(unitprice / (1 - discount)) OVER () AS highest_unitprice
    FROM orderdetails
) od ON p.productid = od.productid
WHERE od.calculated_unitprice = od.highest_unitprice;

说明

  • 两种写法都会先算出每个订单行的无折扣单价,再筛选出单价等于全量订单最高无折扣单价的产品。
  • 写法一适配所有支持子查询的数据库;写法二用窗口函数效率更高,数据量大时优势明显。

内容的提问来源于stack exchange,提问作者Kumail Doctor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:30:58