【问题标题】:How to write this SQL query more elegantly ( joining + max query )如何更优雅地编写这个 SQL 查询(加入 + 最大查询)
【发布时间】: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));

这可行,但我的直觉告诉我我需要使用加入或拥有??

【问题讨论】:

  • 感谢我相应更改的信息
  • 您不应该添加 rdbms 标签...您应该添加显示您正在使用的 what RDBMS 的标签 - sql-server , 或oracle, 或postgresqldb2 或其他任何可能的......
  • 应该独立于平台

标签: sql subquery inner-join where-clause greatest-n-per-group


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 2016-06-13
相关资源
最近更新 更多