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

जब मैं एक कुंजी द्वारा एकत्रित करता हूं तो मैं निर्भर कॉलम को 'ग्रुप बाय' से बाहर क्यों नहीं कर सकता?

क्योंकि केवल PK GROUP BY . में अंतर्निहित तालिका के सभी स्तंभों को कवर करता है खंड। इसलिए आपकी पहली क्वेरी काम करती है। एक UNIQUE बाधा नहीं है।

एक गैर-स्थगित UNIQUE . का संयोजन और एक NOT NULL बाधा भी योग्य होगी। लेकिन यह लागू नहीं किया गया है - साथ ही साथ कुछ अन्य कार्यात्मक निर्भरताएं जिन्हें SQL मानक के लिए जाना जाता है। फीचर के प्रमुख लेखक पीटर एसेंट्राउट के दिमाग में और भी चीजें थीं, लेकिन उस समय यह निर्धारित किया गया था कि मांग कम है और संबंधित लागत अधिक हो सकती है। pgsql-hackers पर सुविधा के बारे में चर्चा देखें।

मैनुअल:

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

जब GROUP BY मौजूद है, या कोई समग्र कार्य मौजूद है, यह SELECT . के लिए मान्य नहीं है कुल कार्यों को छोड़कर या जब असमूहीकृत स्तंभ कार्यात्मक रूप से समूहीकृत स्तंभों पर निर्भर होता है, तो असमूहीकृत स्तंभों को संदर्भित करने के लिए सूची अभिव्यक्तियाँ, क्योंकि अन्यथा एक असमूहित स्तंभ के लिए लौटने के लिए एक से अधिक संभावित मान होंगे। एक कार्यात्मक निर्भरता मौजूद होती है यदि समूहबद्ध स्तंभ (या उसके उपसमूह) समूहबद्ध स्तंभ वाली तालिका की प्राथमिक कुंजी हैं।

और अधिक स्पष्ट रूप से:

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

PostgreSQL कार्यात्मक निर्भरता को पहचानता है (स्तंभों को GROUP BY . से छोड़े जाने की अनुमति देता है ) केवल तभी जब तालिका की प्राथमिक कुंजी GROUP BY . में शामिल हो सूची। SQL मानक अतिरिक्त शर्तों को निर्दिष्ट करता है जिन्हें पहचाना जाना चाहिए।

चूंकि c.vin है UNIQUE NOT NULL , आप इसके बजाय PK कॉलम का उपयोग करके अपनी दूसरी क्वेरी को ठीक कर सकते हैं:

...
group by c.id;

इसके अलावा, जबकि संदर्भात्मक अखंडता को लागू किया जाता है और पूरी तालिका की पूछताछ की जाती है, दिए गए दोनों प्रश्न काफी सस्ते हो सकते हैं:appraisal में कुल पंक्तियां पहले शामिल हों। यह GROUP BY . की आवश्यकता को हटा देता है बाहरी में SELECT संभवतः। पसंद:

SELECT c.vin, c.color, c.brand
     , a.min_appraisal
     , a.max_appraisal
FROM   car c
LEFT   JOIN (
   SELECT car_vin
        , min(price) AS min_appraisal
        , max(price) AS max_appraisal
   FROM   appraisal
   GROUP  BY car_vin
   ) a ON a.car_vin = c.vin;

देखें:

  • एक ही क्वेरी में कई array_agg() कॉल

संबंधित:

  • SQL स्टेटमेंट MySQL में काम कर रहा है जो Postgresql में काम नहीं कर रहा है - Sum &group_by Rails 3
  • PostgreSQL - ग्रुप बाय क्लॉज



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. जब ऑटोवैक्यूम वैक्यूम नहीं करता है

  2. plpgsql चर का उपयोग करके n_distinct सेट करते समय त्रुटि

  3. प्राग PostgreSQL डेवलपर दिवस 2016

  4. ओपनशिफ्ट और नेट-एसएसएच असंगति? (2.9.3-बीटा1 बनाम 2.9.2)

  5. STRING_AGG () PostgreSQL में फ़ंक्शन