PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PGError:त्रुटि:किसी ऑब्जेक्ट की एआर क्वेरी पर WHERE क्लॉज और उसके has_many ऑब्जेक्ट्स में एग्रीगेट की अनुमति नहीं है

त्रुटि संदेश आपको बताता है:

<ब्लॉकक्वॉट>

WHERE क्लॉज में समुच्चय की अनुमति नहीं है

count() एक समग्र कार्य है। उसके लिए HAVING क्लॉज का उपयोग करें।
क्वेरी इस तरह दिख सकती है:

SELECT r.*
FROM   recommendations r
JOIN   approvals       a ON a.recommendation_id = r.id
WHERE  r.user_id = $current_user_id
GROUP  BY r.id
HAVING count(a.recommendation_id) = 1

PostgreSQL 9.1 या बाद के संस्करण के साथ यह GROUP BY . के लिए पर्याप्त है प्राथमिक कुंजी एक तालिका के (recommendations.id . मानते हुए) है पीके)। 9.1 से पहले के पोस्टग्रेज संस्करणों में आपको सभी . को शामिल करना था SELECT . के कॉलम सूची जो GROUP BY . में एकत्रित नहीं हैं सूची। recommendations.* SELECT . में सूची, वह तालिका का हर एक स्तंभ होगा।

मैं पोस्टग्रेएसक्यूएल 9.1 के रिलीज नोट्स उद्धृत करता हूं:

<ब्लॉकक्वॉट>

गैर-GROUP BY . को अनुमति दें जब प्राथमिक कुंजी GROUP BY . में निर्दिष्ट की जाती है, तो क्वेरी लक्ष्य सूची में कॉलम क्लॉज (पीटर एसेंट्रौट)

उप-चयन के साथ आसान

किसी भी तरह से, यह सरल और तेज़ है, वही कर रहा है:

SELECT *
FROM   recommendations r
WHERE  user_id = $current_user_id
AND   (SELECT count(*)
       FROM   approvals
       WHERE  recommendation_id = r.id) = 1;

पंक्तियों को JOIN से गुणा करने से बचें एक प्राथमिकता है, तो आपको उन्हें वापस एकत्रित करने की आवश्यकता नहीं है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL प्रतिकृति 101 के लिए विफलता

  2. Homebrew का उपयोग करके [ईमेल संरक्षित] के केजी इंस्टॉलेशन में पोस्टगिस कैसे स्थापित करें?

  3. चयन के लिए लॉक करें ताकि दूसरी प्रक्रिया को पुराना डेटा न मिले

  4. PostgreSQL 9.0 . में विभाजन तालिका का आकार

  5. SQL मानक समिति में PostgreSQL एजेंट फिर से