如何更优雅地编写这个 SQL 查询(加入 + 最大查询)
Posted
技术标签:
【中文标题】如何更优雅地编写这个 SQL 查询(加入 + 最大查询)【英文标题】:How to write this SQL query more elegantly ( joining + max query ) 【发布时间】:2021-03-18 05:20:26 【问题描述】:好的,我正在使用 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));
这可行,但我的直觉告诉我我需要使用加入或拥有??
【问题讨论】:
Why should I "tag my RDBMS"? 感谢我相应更改的信息 您不应该添加rdbms
标签...您应该添加显示您正在使用的 what RDBMS 的标签 - sql-server
, 或oracle
, 或postgresql
或db2
或其他任何可能的......
应该独立于平台
【参考方案1】:
您需要最大数量的订单日期。
看起来您不需要两个级别的子查询。您可以改用行限制子查询:
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
这将正确处理***关系,因为它将全部返回(而第一个查询仅返回其中一个)。
【讨论】:
第一个查询中有 2 个,..,但是删除一个后我仍然收到语法错误 查询表达式 'rank() over(order by quantity desc) rn' 中的语法错误(缺少运算符)。用于第二次查询【参考方案2】:我认为这是更清洁的解决方案!
最好的问候
select max(od.quantity) as MaxOrder,orderdate
from orderdetails as od inner join orders as o on od.orderid=o.orderid
【讨论】:
不需要GROUP BY
?
不行,查询只会返回一条记录,你可以试试
我收到错误“GROUP BY 子句中未引用列顺序日期”。
是的,你是对的,我在 w3 学校引擎中尝试过,只需按 orderdate 添加结束组 //////----////// select max(od .quantity) as MaxOrder,o.orderdate from orderdetails as od inner join orders as o on od.orderid=o.orderid group by o.orderdate以上是关于如何更优雅地编写这个 SQL 查询(加入 + 最大查询)的主要内容,如果未能解决你的问题,请参考以下文章