Wenn Sie Ihr Datenmodell nicht ändern möchten, können Sie DISTINCT ON
verwenden um den neuesten Datensatz aus Tabelle "b" für jeden Eintrag in "a" zu holen:
SELECT DISTINCT ON (a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY a.id, b.date DESC
Wenn Sie eine "Sortierung" in der Abfrage vermeiden möchten, könnte Sie einen Index wie diesen hinzufügen helfen, aber ich bin mir nicht sicher:
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
Alternativ, wenn Sie Datensätze aus Tabelle "a" irgendwie sortieren möchten:
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 Ansätze
Alle oben genannten Abfragen müssen jedoch immer noch alle referenzierten Zeilen lesen aus Tabelle "b". Wenn Sie also viele Daten haben, ist es möglicherweise immer noch zu langsam.
Sie könnten eine neue Tabelle erstellen, die nur den neuesten "b"-Datensatz für jede a.id
enthält -- oder diese Spalten sogar in die "a"-Tabelle selbst verschieben.