यदि आप अपना डेटा मॉडल नहीं बदलना चाहते हैं, तो आप DISTINCT ON
. का उपयोग कर सकते हैं "ए" में प्रत्येक प्रविष्टि के लिए तालिका "बी" से नवीनतम रिकॉर्ड लाने के लिए:
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
वैकल्पिक रूप से, यदि आप तालिका "ए" से रिकॉर्ड को किसी तरह से सॉर्ट करना चाहते हैं:
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
वैकल्पिक दृष्टिकोण
हालांकि, उपरोक्त सभी प्रश्नों को अभी भी सभी संदर्भित पंक्तियों को पढ़ने की आवश्यकता है तालिका "बी" से, इसलिए यदि आपके पास बहुत अधिक डेटा है, तो यह अभी भी बहुत धीमा हो सकता है।
आप एक नई तालिका बना सकते हैं, जिसमें प्रत्येक a.id
. के लिए केवल नवीनतम "b" रिकॉर्ड हो -- या यहां तक कि उन स्तंभों को "a" तालिका में ही ले जाएं।