如何在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
相关产品推荐
相关产品推荐

