2011-05-04 71 views
4

不知道我會如何描述這個,所以我認爲我的標題可能有點偏離。但它歸結爲,「請寫這個查詢對我來說,我被堵得要命」如何同時查詢父母詳細信息和最佳子女記錄?

我有兩個表(相關部分只)

//MyEntity 
-------- 
Id 
Name 

//MyEntLogEntries 
--------------- 
MyEntityId 
TimeStamp 
Username 
Content 

我想以這種形式返回一個列表

Entity.Id,Name,"latest related log entry's username WITH a username not null" 

但是,日誌條目可能有更新的條目沒有用戶名。所以我需要使用用戶名的最後一個條目。

我一直在獲取實體列表並單獨查詢最新條目,但這給了我可怕的N + 1查詢報告。

回答

4

一種方式

SELECT E.Id, E.Name, T.* 
FROM MyEntity E 
OUTER APPLY(SELECT TOP 1 * 
      FROM MyEntLogEntries L WHERE L.MyEntityId = E.Id AND Username IS NOT NULL 
      ORDER BY TimeStamp DESC) T 

而另一

;WITH CTE AS 
(
SELECT E.Id, 
     E.Name, 
     L.MyEntityId, 
     L.TimeStamp, 
     L.Username, 
     L.Content, 
     ROW_NUMBER() OVER (PARTITION BY E.Id ORDER BY TimeStamp DESC) AS RN 
FROM MyEntity E 
LEFT JOIN MyEntLogEntries L ON L.MyEntityId = E.Id AND Username IS NOT NULL 

) 
SELECT * 
FROM CTE 
WHERE RN=1 
+0

這是完美的。 – hometoast 2011-05-04 15:03:29

相關問題