此sql查询中是否需要联接?

此sql查询中是否需要联接?,sql,Sql,假设我有一个sql中的Orders表,它有4列(OrderId int、ProductID int、Price money、Size int),OrderId和ProductID作为联合主键 如果我希望查询返回每个产品的最新订单(以及价格和大小)(即最大订单ID),有没有一种方法可以在没有联接的情况下执行此操作 我想到了以下几点: select o.OrderId, o.ProductId, o.Price, o.Size from Orders o inner join (select Ma

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

如果我希望查询返回每个产品的最新订单(以及价格和大小)(即最大订单ID),有没有一种方法可以在没有联接的情况下执行此操作

我想到了以下几点:

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
但这似乎不是最优雅的解决方案


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

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

你为什么要摆脱加入?关系数据库对连接(关系理论)进行了优化,因此移除它们可能会影响性能。如果您关心订单放置的时间和/或日期,则应考虑添加日期列。然后,您可以按该列进行订购。即使有一个日期列,并且您是根据该列进行订购的,这也无助于您找到每种产品类型的最新订单,因为您可以让最近的几份订单属于同一产品类型。但这将返回所有不同的(productId、price、size)元组,但这并不是我想要的。从性能的角度来看,我个人经常使用您上面使用的模式,很少有问题。我同意不能用聚合器函数和分组方式来实现这一点,但这似乎是一个非常常见的问题,我已经遇到过几次,所以我乐观地认为可能有一种聪明的方式将其框定为应用程序或类似的东西。这基本上是一种聪明的方式。我对我管理的几个表中的电子邮件地址和活动日期做了基本相同的事情,通过电子邮件分组以获取最新的活动,然后重新加入以获取这些行的所有信息。我能理解对更细致/高效解决方案的渴望,但在这种情况下,没有一个解决方案。
select
 MAX(o.OrderId) as NewestOrderID,
 o.ProductId,
 o.Price,
 o.Size
from Orders o
Group by
 o.ProductId,
 o.Price,
 o.Size