如何更优雅地编写这个 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, 或postgresqldb2 或其他任何可能的...... 应该独立于平台 【参考方案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 查询(加入 + 最大查询)的主要内容,如果未能解决你的问题,请参考以下文章

SQL 更新 - 有没有更优雅、更有效的方法来做到这一点?

如何使这个 SQL 查询更高效?

如何使用 Spring 的 JDBCTemplate 有效地执行 IN() SQL 查询?

如何最有效地编写SQL

如何使这个联合查询更有效率?

如何编写JPA查询