2013-02-19 58 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

相關問題