साधारण क्वेरी
यह बहुत आसान हो सकता है PostgreSQL 9.1 या बाद के संस्करण . के साथ . जैसा कि इस निकट से संबंधित उत्तर में बताया गया है:
- PGError:ERROR:किसी ऑब्जेक्ट और उसके has_many ऑब्जेक्ट्स की AR क्वेरी पर WHERE क्लॉज में एग्रीगेट की अनुमति नहीं है
यह GROUP BY
. के लिए पर्याप्त है प्राथमिक कुंजी एक टेबल का। चूंकि:
foo1 एक प्राथमिक कुंजी है
.. आप अपने उदाहरण को सरल बना सकते हैं:
SELECT foo1, foo2, foo3, foo4, foo5, foo6, string_agg(aggregated_field, ', ')
FROM tbl1
GROUP BY 1
ORDER BY foo7, foo8; -- have to be spelled out, since not in select list!
एकाधिक तालिकाओं वाली क्वेरी
हालांकि, चूंकि आपके पास:
<ब्लॉकक्वॉट>कई और फ़ील्ड और लेफ्ट जॉइन, महत्वपूर्ण हिस्सा यह है कि इन सभी क्षेत्रों में 1 से 1 या 1 से 0 संबंध हैं, एक फ़ील्ड को छोड़कर जो कि 1 से n है जिसे मैं एकत्र करना चाहता हूं
.. पहले एकत्र करना, बाद में शामिल होना . यह तेज़ और आसान होना चाहिए :
SELECT t1.foo1, t1.foo2, ...
, t2.bar1, t2.bar2, ...
, a.aggregated_col
FROM tbl1 t1
LEFT JOIN tbl2 t2 ON ...
...
LEFT JOIN (
SELECT some_id, string_agg(agg_col, ', ') AS aggregated_col
FROM agg_tbl a ON ...
GROUP BY some_id
) a ON a.some_id = ?.some_id
ORDER BY ...
इस तरह आपकी क्वेरी के बड़े हिस्से को एकत्रीकरण की बिल्कुल भी आवश्यकता नहीं है।
मैंने हाल ही में इस संबंधित उत्तर में बिंदु को साबित करने के लिए SQL Fiddle में एक परीक्षण केस प्रदान किया है:
- PostgreSQL - एक सरणी द्वारा क्रम
चूंकि आप इस संबंधित उत्तर की बात कर रहे हैं:नहीं, DISTINCT
इस मामले में बिल्कुल भी मदद नहीं करेगा।