如何从含Productos与Productos_Presentaciones表的库存数据库中查询库存最高的单个产品?
我来帮你解决这个问题——你的原查询之所以返回多个结果,是因为GROUP BY p.Nombre会把每个产品分组后计算它的最大库存,所以会列出所有产品各自的最大库存值。要只拿到全局库存最高的那一个产品,我们可以用几种不同的方案,你可以根据自己使用的数据库类型选择:
方案1:先找全局最大库存,再关联查询(通用所有数据库)
这种方法兼容性最好,几乎所有SQL数据库都支持。先通过子查询找到库存的最大值,再关联两张表找出对应的产品:
SELECT p.Nombre AS PRODUCTO, pp.Existencias AS EXISTENCIA FROM Productos_Presentaciones pp JOIN Productos p ON pp.Id_Producto = p.Id_Producto WHERE pp.Existencias = (SELECT MAX(Existencias) FROM Productos_Presentaciones)
注意:如果有多个产品的库存都是这个最大值,这个查询会返回所有符合的结果。如果只需要返回其中一个,可以在末尾添加
LIMIT 1(MySQL/PostgreSQL)或者TOP 1(SQL Server)。
方案2:排序后取第一条(适合支持LIMIT/TOP的数据库)
直接按库存降序排列结果,然后只取第一条记录,写法更简洁:
- 针对MySQL/PostgreSQL:
SELECT p.Nombre AS PRODUCTO, pp.Existencias AS EXISTENCIA FROM Productos_Presentaciones pp JOIN Productos p ON pp.Id_Producto = p.Id_Producto ORDER BY pp.Existencias DESC LIMIT 1;
- 针对SQL Server:
SELECT TOP 1 p.Nombre AS PRODUCTO, pp.Existencias AS EXISTENCIA FROM Productos_Presentaciones pp JOIN Productos p ON pp.Id_Producto = p.Id_Producto ORDER BY pp.Existencias DESC;
方案3:用窗口函数处理并列情况(进阶用法)
如果需要处理「多个产品库存并列最高」的场景,窗口函数能更灵活地控制结果:
SELECT PRODUCTO, EXISTENCIA FROM ( SELECT p.Nombre AS PRODUCTO, pp.Existencias AS EXISTENCIA, -- 按库存降序排名,相同库存会有相同排名 RANK() OVER (ORDER BY pp.Existencias DESC) AS ranking FROM Productos_Presentaciones pp JOIN Productos p ON pp.Id_Producto = p.Id_Producto ) AS ranked_products WHERE ranking = 1;
这里用
RANK()会保留并列排名(比如两个产品都是最高库存,都会显示);如果只想取其中一个,把RANK()换成ROW_NUMBER()即可。
内容的提问来源于stack exchange,提问作者Enrique González Carrillo
相关产品推荐
相关产品推荐

