Я использую один и тот же шаблон SQL снова и снова, и я знаю, что должен быть лучший способ, но у меня возникают проблемы с его объединением. Вот простая версия шаблона, где я отвлекаю информацию о студенте и последнюю книгу, которую они проверяли, если таковая существует:
SELECT TStudents.*,
BookName = (SELECT TOP 1 BookName
FROM TBookCheckouts
WHERE StudentID = TStudents.ID
ORDER BY DateCheckedOut DESC),
BookAuthor = (SELECT TOP 1 BookAuthor
FROM TBookCheckouts
WHERE StudentID = TStudents.ID
ORDER BY DateCheckedOut DESC),
BookCheckout = (SELECT TOP 1 DateCheckedOut
FROM TBookCheckouts
WHERE StudentID = TStudents.ID
ORDER BY DateCheckedOut DESC)
FROM TStudents
(Для этого примера, пожалуйста, проигнорируйте тот факт, что TBookCheckouts, вероятно, следует разделить на TCheckouts и TBooks)
Что я пытаюсь проиллюстрировать: у меня, как правило, много подзапросов для столбцов из одной таблицы. Мне также приходится сортировать те подклассифицированные таблицы по дате, чтобы получить самую последнюю запись, поэтому она не так проста (по крайней мере для меня), как делает LEFT JOIN. Обратите внимание, что, за исключением того, какое поле возвращается, я по существу делаю тот же подзапрос 3 раза. SQL Server может быть достаточно умным, чтобы оптимизировать это, но я не думаю (мне обязательно нужно лучше читать планы выполнения...).
Хотя могут быть преимущества для его структурирования таким образом (иногда это становится более читаемым, если у меня есть множество подзапросов и подтабликов), похоже, что это не особенно эффективно.
Я изучил выполнение LEFT JOIN из производной таблицы, возможно, включая ROW_NUMBER() и PARTITION BY, но я просто не могу собрать все это вместе.