У меня проблемы с поиском решения этого SQL-запроса.
Схема
Редактировать : Добавление таблицы элементов
Таблица элементов
- PK ItemID
- много других столбцов
Таблица связывания
- FK ItemID уникальный идентификатор
- FK TransactionID уникальный идентификатор
Таблица транзакций
- PK ID уникальный идентификатор
- EntryDateTime DateTime
- (несколько других строк типа int, varchar ...)
Редактировать : Мне кажется, я не прояснил отношения. Каждый ПУНКТ (таблица не показана) может иметь несколько транзакций. Несколько элементов могут совместно использовать одну и ту же транзакцию (отсюда и таблица ссылок).
Пожалуйста, смотрите в нижней части для моего текущего запроса. Я оставил это пораженным, чтобы показать ход вопроса.
Я хочу сделать что-то вроде этого запроса. Хитрость заключается в том, что я хочу, чтобы столбцы t.varchar и t.int имели значения в строке MAX (t.EntryDateTime). Я даже не знаю, является ли group by правильным способом выполнения этого запроса.
SELECT lt.ItemID, MAX(t.EntryDateTime), t.varchar, t.int
FROM LinkingTable lt
LEFT JOIN Transactions t ON lt.TransactionID = t.ID
GROUP BY lt.ItemID
Эта таблица будет объединена в этом запросе SQL, поэтому, пожалуйста, попробуйте дать мне наиболее эффективное решение. Предположим, что Table1 будет содержать миллионы записей.
SELECT
(many columns)
FROM Table1
LEFT JOIN Table2 ON Table1.Table2ID = Table2.ID
LEFT JOIN Table3 ON ....
LEFT JOIN Table4 ON (Table2.ID = Table4.Table2ID and Table4.LocaleID = 127 and Table4.Type = 0)
LEFT JOIN **the query above** AS vTable1 ON vTable1.ItemID = Table1.ID
WHERE Table1.CheckID IN (SELECT ID FROM Checks WHERE ....)
Редактировать : У меня есть запрос, который работает , но я не уверен, что он наиболее эффективен. LinkingTable имеет ~ 200 тыс. Записей, и его запуск занимает 6 секунд.
SELECT DISTINCT lt.ItemID, t.EntryDateTime, t.varchar, t.int
FROM LinkingTable lt
LEFT JOIN Transactions t ON t.id = (SELECT Top 1 t2.id FROM LinkingTable lt2
LEFT JOIN Transactions t2 on lt2.TransactionID = t2.ID
where lt2.ItemID = lt.ItemID ORDER BY t2.PrintTime DESC)