如何同时查询父详细信息和顶级子记录?

时间:2011-05-04 13:51:33

标签: sql sql-server-2005

我不确定如何描述这一点,所以我认为我的头衔可能有些偏差。但它归结为,“请为我写这个查询,我被困在地狱”

我有两张桌子(仅限相关部分)

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

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

我想以此格式返回一个列表

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

但是日志条目可能包含没有用户名的较新条目。所以我需要用户名的最后一个条目。

我一直在获取实体列表并单独查询最新条目,但这给了我对报告的可怕N + 1查询。

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