Hvis du ikke vil ændre din datamodel, kan du bruge DISTINCT ON
for at hente den nyeste post fra tabel "b" for hver post i "a":
SELECT DISTINCT ON (a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY a.id, b.date DESC
Hvis du vil undgå en "sortering" i forespørgslen, kan du tilføje et indeks som dette kan hjælpe dig, men jeg er ikke sikker:
CREATE INDEX b_id_date ON b (id, date DESC)
SELECT DISTINCT ON (b.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY b.id, b.date DESC
Alternativt, hvis du vil sortere poster fra tabel "a" på en eller anden måde:
SELECT DISTINCT ON (sort_column, a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY sort_column, a.id, b.date DESC
Alternative tilgange
Alle ovenstående forespørgsler skal dog stadig læse alle referencer fra tabel "b", så hvis du har mange data, kan det stadig være for langsomt.
Du kan oprette en ny tabel, som kun indeholder den nyeste "b"-record for hver a.id
-- eller endda flytte disse kolonner ind i selve "a"-tabellen.