У меня есть две таблицы: TableA (ID [int, pk], Name [string])
и TableB (ID [int, pk], TableA_ID [int, fk], Name [string], DateStamp [datetime (dd/mm/yyyy hh:MM:ss)])
. Между TableA и TableB существует отношение один ко многим.
Внутреннее соединение двух таблиц даст мне следующие результаты:
TableA.ID, TableA.Name, TableB.Name, TableB.DateStamp
1, 'File A', 'Version 1', 01/01/2009 15:00:00
1, 'File A', 'Version 2', 05/01/2009 08:15:00
1, 'File A', 'Version 3', 06/01/2009 19:33:00
2, 'File B', 'Version 1', 03/01/2009 09:10:00
2, 'File B', 'Version 2', 20/01/2009 20:00:00
3, 'File C', 'Version 1', 01/01/2009 17:00:00
На самом деле мне нужно следующее (каждая строка из TableA и последняя соответствующая строка из TableB):
TableA.ID, TableA.Name, TableB.Name, TableB.DateStamp
1, 'File A', 'Version 3', 06/01/2009 19:33:00
2, 'File B', 'Version 2', 20/01/2009 20:00:00
3, 'File C', 'Version 1', 01/01/2009 17:00:00
Это запрос, который я использую для достижения этой цели:
SELECT ta.ID, ta.Name, tb.Name, tb.DateStamp
FROM TableA ta INNER JOIN TableB tb ON ta.ID = tb.TableA_ID
WHERE tb.ID IN (
SELECT TOP 1 tb2.ID
FROM TableB tb2
WHERE tb2.TableA_ID = ta.ID
ORDER BY tb2.DateStamp DESC)
Это работает, но мое внутреннее чувство состоит в том, что я делаю это не "лучшим образом". Похоже, что он является кандидатом на запрос агрегации (то есть groupby), но мне не повезло с этим. В конце мне всегда приходилось использовать подзапрос, чтобы получить строку, которую я ищу в TableB.
Любая помощь высоко ценится.