Хотя больше, возможно, это будет работать лучше.
SELECT
A.*,
B3.value
FROM
(
SELECT B.id, MAX(B.seqNr) MaxSeqNr
FROM B
GROUP BY B.id
) B2
INNER JOIN
B B3
ON
B2.id = B3.id AND B2.MaxSeqNr = B3.seqNr
INNER JOIN
A
ON
A.id = B3.id
Также возможно, что он будет работать хуже. Нужны реальные данные, чтобы проверить и увидеть. : -)
Кроме того, создание составного индекса на B.id, B.seqNr DESC
может повысить производительность как исходного, так и этого альтернативного запроса.
Если вы можете задержать теоретических пуристов в своей организации, вы можете значительно повысить производительность, добавив поле LatestPaymentForA
и используя триггер для синхронизации этого поля. Всякий раз, когда новая запись вставляется в B
, обновите существующую запись B
, где LastPaymentFromA
имеет значение true и имеет тот же id
, затем вставьте новую запись с LastPaymentFromA
в значение true.
Тогда вы можете сделать что-то действительно быстрое, как это:
SELECT
A.*,
B.value
FROM
A
INNER JOIN
B
On
A.id = B.id
WHERE
B.LastPaymentFromA = 1