2013-02-19 83 views
1

我有这种情况。我有一个与OrderStatus有关的表Orders从关系中选择最后一条记录

OrderStatus

id | orderId | created

我需要用它最后状态检索Orders。我试过这个查询,我不知道它是否是高性能的。我需要知道是否有更好的解决方案。

select Orders.id, OrderStatus.status from Orders 
inner join OrderStatus on OrderStatus.id = 
    (select top 1 id from OrderStatus where orderId = Order.id order by created desc) 

回答

2

相关的子查询通常是坏消息(有时SQL Server可以优化它,有时它的行为就像一个非常慢的循环)。另外不知道为什么你认为你需要DISTINCT当你只考虑最新的状态,除非你没有任何主键...

;WITH x AS 
(
    SELECT o.id, os.status, 
    rn = ROW_NUMBER() OVER (PARTITION BY os.orderId ORDER BY created DESC) 
    FROM dbo.Orders AS o 
    INNER JOIN dbo.OrderStatus AS os 
    ON o.id = os.orderId 
) 
SELECT id, status 
    FROM x 
    WHERE rn = 1; 
+0

是的,我删除了'distinct'。该代码是一个较长的查询提取,并滑入。感谢您的解释! – 2013-02-19 16:09:37

2

可以使用Row_Number功能:

WITH CTE AS 
(
    SELECT Orders.id, OrderStatus.status, 
     RN = ROW_NUMBER() OVER (
         PARTITION BY OrderStatus.OrderId 
         ORDER BY created DESC) 
    FROM Orders 
    INNER JOIN OrderStatus ON OrderStatus.OrderId = Orders.id 
) 
SELECT id, status 
FROM CTE WHERE RN = 1 

我已经使用了common-table-expression,因为它能够直接过滤和它也是非常具有可读性。

+0

现在我有真正的大问题,你都提供几乎同样的答案!我想我会选择亚伦的回应,因为它有一个有趣的解释。谢谢 – 2013-02-19 16:17:02

相关问题