Nếu bạn không muốn thay đổi mô hình dữ liệu của mình, bạn có thể sử dụng DISTINCT ON
để tìm nạp bản ghi mới nhất từ bảng "b" cho mỗi mục nhập trong "a":
SELECT DISTINCT ON (a.id) *
FROM a
INNER JOIN b ON a.id=b.id
ORDER BY a.id, b.date DESC
Nếu bạn muốn tránh "sắp xếp" trong truy vấn, hãy thêm chỉ mục như thế này might giúp bạn, nhưng tôi không chắc:
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
Ngoài ra, nếu bạn muốn sắp xếp các bản ghi từ bảng "a" theo một cách nào đó:
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
Các phương pháp thay thế
Tuy nhiên, tất cả các truy vấn trên vẫn cần đọc tất cả các hàng được tham chiếu từ bảng "b", vì vậy nếu bạn có nhiều dữ liệu, nó vẫn có thể quá chậm.
Bạn có thể tạo một bảng mới, bảng này chỉ giữ bản ghi "b" mới nhất cho mỗi a.id
- hoặc thậm chí di chuyển các cột đó vào chính bảng "a".