Я использую один и тот же шаблон 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, но я просто не могу собрать все это вместе.