【问题标题】:Is a join necessary in this sql query?此 sql 查询中是否需要连接?
【发布时间】:2010-10-01 03:50:01
【问题描述】:

假设我在 sql 中有一个包含 4 列(OrderId int、ProductID int、Price money、Size int)的表 Orders,其中 OrderID 和 ProductID 作为联合主键。

如果我希望查询返回每个产品的最新订单(以及价格和尺寸)(即最大 OrderId),有没有办法在没有连接的情况下做到这一点?

我在想以下几点:

select o.OrderId, o.ProductId, o.Price, o.Size
from Orders o inner join 
(select Max(OrderId) OrderId, ProductId from Orders group by ProductId) recent
on o.OrderId = recent.OrderId and o.ProductId = recent.ProductId

但这似乎不是最优雅的解决方案。

此外,假设包含多个产品的订单会生成多行。它们都必须是主键的一部分。

【问题讨论】:

  • 你为什么要摆脱连接?关系数据库针对连接进行了优化(关系理论),因此删除它们可能会影响性能。
  • 如果您关心下订单的时间和/或日期,您应该考虑添加一个日期列。然后您可以按该列排序。
  • 即使有一个日期列并且您基于此订购,这也无法帮助您找到每种产品类型的最新订单,因为您可以让最近的几个订单相同产品类型。

标签: sql


【解决方案1】:

不,没有。你有正确的想法。您需要执行子查询以获取 max(orderID)、productID 对,然后将其连接到完整表以将查询限制为完整表中包含最大 OrderId 的行。

【讨论】:

  • 我同意无法使用聚合器函数和 group by 来做到这一点,但这似乎是一个很常见的问题,我遇到过几次所以我很乐观可能是一种巧妙的方式来将其构建为应用程序或类似的东西。
  • 这基本上是聪明的方法。我对我管理的几张桌子上的电子邮件地址和活动日期做基本相同的事情,通过电子邮件分组以获取最近的活动,然后重新加入以获取这些行的所有信息。我可以理解对更细微/有效解决方案的渴望,但在这种情况下,没有。
【解决方案2】:
select
 MAX(o.OrderId) as NewestOrderID,
 o.ProductId,
 o.Price,
 o.Size
from Orders o
Group by
 o.ProductId,
 o.Price,
 o.Size

【讨论】:

  • 但这会返回所有不同的(productId、price、size)元组,这不是我想要的
  • 确实如此。从性能的角度来看,我个人非常频繁地使用您在上面使用的模式,并且很少遇到问题。
猜你喜欢
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 2023-03-20
  • 2017-07-15
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多