データモデルを変更したくない場合は、DISTINCT ON
を使用できます。 「a」の各エントリについて、テーブル「b」から最新のレコードをフェッチするには:
SELECT DISTINCT ON (a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY a.id, b.date DESC
クエリで「並べ替え」を避けたい場合は、次のようなインデックスを追加してください 助けてくれますが、よくわかりません:
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
または、テーブル「a」のレコードを何らかの方法で並べ替える場合:
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
代替アプローチ
ただし、上記のすべてのクエリは、参照されているすべての行を読み取る必要があります。 テーブル「b」からのデータなので、データが多い場合でも、速度が遅すぎる可能性があります。
各a.id
の最新の「b」レコードのみを保持する新しいテーブルを作成できます。 -または、それらの列を「a」テーブル自体に移動することもできます。