Om du inte vill ändra din datamodell kan du använda DISTINCT ON
för att hämta den senaste posten från tabell "b" för varje 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
Om du vill undvika en "sortering" i frågan kan du lägga till ett index som detta kan hjälpa dig, men jag är inte säker:
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, om du vill sortera poster från tabell "a" på något sätt:
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
Alternativa tillvägagångssätt
Men alla ovanstående frågor måste fortfarande läsa alla refererade rader från tabell "b", så om du har mycket data kan det fortfarande gå för långsamt.
Du kan skapa en ny tabell som bara innehåller den senaste "b"-posten för varje a.id
-- eller till och med flytta dessa kolumner till själva "a"-tabellen.