假设我有2个表:客户和订单.客户可以拥有多个订单.
现在,我需要向任何客户展示他最新的订单.这意味着如果客户有多个订单,则仅显示具有最新进入时间的订单.
这是我自己管理的程度:
SELECT a.*, b.Id FROM Customer a INNER JOIN Order b ON b.CustomerID = a.Id ORDER BY b.EntryTime DESC
这当然会返回所有拥有一个或多个订单的客户,首先显示每个客户的最新订单,这不是我想要的.此时我的思绪陷入了困境,所以我希望有人可以指出我正确的方向.
出于某种原因,我想我需要在某个地方使用MAX语法,但它现在就让我失望了.
更新:在这里经过几个答案后(有很多!),我意识到我犯了一个错误:我的意思是任何客户都有他的最新记录.这意味着如果他没有订单,那么我就不需要列出他.
UPDATE2:修复了我自己的SQL语句,这可能不会导致其他人混淆.
我不认为您确实想要使用MAX(),因为您不想对OrderID进行分组.你需要的是一个带有SELECT TOP 1的有序子查询.
select * from Customers inner join Orders on Customers.CustomerID = Orders.CustomerID and OrderID = ( SELECT TOP 1 subOrders.OrderID FROM Orders subOrders WHERE subOrders.CustomerID = Orders.CustomerID ORDER BY subOrders.OrderDate DESC )
虽然我看到你已经接受了答案,但我认为这个更直观:
select a.* ,b.Id from customer a inner join Order b on b.CustomerID = a.Id where b.EntryTime = ( select max(EntryTime) from Order where Id = b.Id );
我必须通过执行计划来运行这样的事情以查看执行的差异,但是TOP函数在事后完成并且使用"order by"可能很昂贵,我相信使用max(EntryTime)将是运行此方法的最佳方式.
这样的事情应该做到:
SELECT X.*, Y.LatestOrderId FROM Customer X LEFT JOIN ( SELECT A.Customer, MAX(A.OrderID) LatestOrderId FROM Order A JOIN ( SELECT Customer, MAX(EntryTime) MaxEntryTime FROM Order GROUP BY Customer ) B ON A.Customer = B.Customer AND A.EntryTime = B.MaxEntryTime GROUP BY Customer ) Y ON X.Customer = Y.Customer
假设同一客户的两个订单可能具有相同的EntryTime,这就是为什么MAX(OrderID)
在子查询中使用该订单Y
以确保每个客户仅发生一次。使用,LEFT JOIN
是因为您说过要显示所有客户-如果他们没有任何订单,则LatestOrderId将为NULL
。
希望这可以帮助!
-
更新:-)仅显示有订单的客户:
SELECT A.Customer, MAX(A.OrderID) LatestOrderId FROM Order A JOIN ( SELECT Customer, MAX(EntryTime) MaxEntryTime FROM Order GROUP BY Customer ) B ON A.Customer = B.Customer AND A.EntryTime = B.MaxEntryTime GROUP BY Customer