SELECT v.*
FROM document d
OUTER APPLY
(
SELECT TOP 1 *
FROM version v
WHERE v.document = d.id
ORDER BY
v.revision DESC
) v
или
SELECT v.*
FROM document d
LEFT JOIN
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY v.id ORDER BY revision DESC)
FROM version
) v
ON v.document = d.id
AND v.rn = 1
Последнее более эффективно, если в ваших документах обычно мало изменений, и вам нужно выбрать все или почти все документы; первый более эффективен, если в документах много ревизий или вам нужно выбрать только небольшой набор документов.
Обновление:
Извините, не заметил вопрос о MySQL
.
В MySQL
вы делаете это так:
SELECT *
FROM document d
LEFT JOIN
version v
ON v.id =
(
SELECT id
FROM version vi
WHERE vi.document = d.document
ORDER BY
vi.document DESC, vi.revision DESC, vi.id DESC
LIMIT 1
)
Создайте составной индекс на version (document, revision, id)
, чтобы это работало быстро.