如何更优雅地编写这个SQL查询(joining+max查询)



好的,我使用w3school 中的以下示例

https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all

我想知道订购金额的日期

SELECT OrderDate 
FROM Orders
WHERE OrderID = (SELECT OrderID 
FROM OrderDetails 
WHERE Quantity = (SELECT MAX(Quantity)  
FROM OrderDetails));

这很有效,但我的直觉告诉我,我需要加入还是拥有??

您需要具有最大数量的订单的日期。

看起来您并不需要两个级别的子查询。您可以使用行限制子查询:

select orderdate 
from orders
where orderid = (select orderid from from orderdetails order by quantity desc limit 1)

这会更短,如果有多个订单具有相同的最大数量,也不会失败(而原始代码会失败,因为子查询返回多行(。

另一种方法使用窗口函数:

select o.orderdate
from orders o
inner join (
select od.*, rank() over(order by quantity desc) rn
from orderdetails od
) od on od.orderid = o.orderid
where od.rn = 1

这将正确地处理顶部联系,因为它将返回所有联系(而第一个查询只返回其中一个(。

我认为这是一个更清洁的解决方案!

向致以最良好的问候

select max(od.quantity) as MaxOrder,orderdate
from orderdetails as od inner join orders as o on od.orderid=o.orderid

最新更新