Как я могу одновременно запросить информацию о родительских и верхних дочерних записях? - PullRequest
4 голосов
/ 04 мая 2011

Не уверен, как бы я описал это, поэтому я думаю, что мой заголовок может быть немного не так.Но это сводится к: «Пожалуйста, напишите этот запрос для меня, я застрял в аду»

У меня есть две таблицы (только соответствующие части)

//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 Ответ

4 голосов
/ 04 мая 2011

В одну сторону

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...