जैसा कि फ्रैंक ने समझाया, PostgreSQL किसी भी क्वेरी को अस्वीकार कर देगा जो पंक्तियों के प्रतिलिपि प्रस्तुत करने योग्य सेट को वापस नहीं करता है।
मान लीजिए कि आपके पास एक प्रश्न है जैसे:
select a, b, agg(c)
from tbl
group by a
PostgreSQL इसे अस्वीकार कर देगा क्योंकि b
group by
. में अनिर्दिष्ट छोड़ दिया गया है बयान। इसके विपरीत, MySQL में चलाएं, और इसे स्वीकार कर लिया जाएगा। हालांकि, बाद के मामले में, कुछ इंसर्ट, अपडेट और डिलीट को सक्रिय करें, और डिस्क पेजों पर पंक्तियों का क्रम अलग हो जाता है।
यदि स्मृति कार्य करती है, तो कार्यान्वयन विवरण इस प्रकार हैं कि MySQL वास्तव में a, b द्वारा सॉर्ट करेगा और सेट में पहला b लौटाएगा। लेकिन जहां तक SQL मानक का संबंध है, व्यवहार अनिर्दिष्ट है - और निश्चित रूप से पर्याप्त है, PostgreSQL नहीं करता है समग्र कार्यों को चलाने से पहले हमेशा क्रमबद्ध करें।
संभावित रूप से, इसके परिणामस्वरूप b
. के विभिन्न मान हो सकते हैं परिणाम PostgreSQL में सेट किया गया। और इस प्रकार, PostgreSQL एक त्रुटि उत्पन्न करता है जब तक कि आप अधिक विशिष्ट न हों:
select a, b, agg(c)
from tbl
group by a, b
फ्रैंक ने जिस बात पर प्रकाश डाला वह यह है कि, PostgreSQL 9.1 में, यदि a
प्राथमिक कुंजी है, जिससे आप b
छोड़ सकते हैं अनिर्दिष्ट - योजनाकार को बाद के समूह को फ़ील्ड द्वारा अनदेखा करना सिखाया गया है जब लागू प्राथमिक कुंजी एक अद्वितीय पंक्ति दर्शाती है।
विशेष रूप से आपकी समस्या के लिए, आपको अपने समूह को इस प्रकार निर्दिष्ट करना होगा जैसे आप वर्तमान में करते हैं, प्लस प्रत्येक फ़ील्ड जिस पर आप अपना समग्र आधार बना रहे हैं, अर्थात "widgets"."id", "widgets"."user_id", [snip]
लेकिन sum(amount)
. जैसी चीजें नहीं , जो कुल फ़ंक्शन कॉल हैं।
एक ऑफ टॉपिक साइड नोट के रूप में, मुझे यकीन नहीं है कि आपका ओआरएम/मॉडल कैसे काम करता है लेकिन जो एसक्यूएल उत्पन्न कर रहा है वह इष्टतम नहीं है। उन बाएं बाहरी जोड़ों में से कई ऐसा लगता है कि उन्हें आंतरिक जुड़ाव होना चाहिए। इसके परिणामस्वरूप, जहां लागू हो, योजनाकार को एक उपयुक्त ज्वाइन ऑर्डर चुनने की अनुमति मिलेगी।