如何更优雅地编写此 SQL 查询(加入 + 最大查询)
How to write this SQL query more elegantly ( joining + max query )
好的,我正在使用 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));
这行得通,但我的直觉告诉我,我需要使用 joining 或 having ??
您想要数量最大的订单日期。
看起来您不需要两级子查询。您可以改用行限制子查询:
select orderdate
from orders
where orderid = (select orderid from from orderdetails order by quantity desc limit 1)
这个更短,如果有多个订单具有相同的最大数量也不会失败(而您的原始代码会失败,因为子查询 return 不止一行)。
另一种方法使用 window 函数:
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
这将正确处理顶级关系,因为它将 return 所有关系(而第一个查询 return 只是其中一个)。
我认为这是更简洁的解决方案!
此致
select max(od.quantity) as MaxOrder,orderdate
from orderdetails as od inner join orders as o on od.orderid=o.orderid
好的,我正在使用 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));
这行得通,但我的直觉告诉我,我需要使用 joining 或 having ??
您想要数量最大的订单日期。
看起来您不需要两级子查询。您可以改用行限制子查询:
select orderdate
from orders
where orderid = (select orderid from from orderdetails order by quantity desc limit 1)
这个更短,如果有多个订单具有相同的最大数量也不会失败(而您的原始代码会失败,因为子查询 return 不止一行)。
另一种方法使用 window 函数:
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
这将正确处理顶级关系,因为它将 return 所有关系(而第一个查询 return 只是其中一个)。
我认为这是更简洁的解决方案!
此致
select max(od.quantity) as MaxOrder,orderdate
from orderdetails as od inner join orders as o on od.orderid=o.orderid