我不确定如何描述这一点,所以我认为我的头衔可能有些偏差。但它归结为,“请为我写这个查询,我被困在地狱”
我有两张桌子(仅限相关部分)
//MyEntity
--------
Id
Name
//MyEntLogEntries
---------------
MyEntityId
TimeStamp
Username
Content
我想以此格式返回一个列表
Entity.Id,Name,"latest related log entry's username WITH a username not null"
但是日志条目可能包含没有用户名的较新条目。所以我需要用户名的最后一个条目。
我一直在获取实体列表并单独查询最新条目,但这给了我对报告的可怕N + 1查询。
答案 0 :(得分: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