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

मेरे पास COUNT('e.id') या COUNT(e.id) के लिए क्वेरी से भिन्न परिणाम हैं

'e.id' एक स्ट्रिंग स्थिरांक है, इसलिए COUNT('e.id') COUNT(*) . कहने का एक अजीब, भ्रामक तरीका है ।

COUNT(e.id) दूसरी ओर, परिणाम में सभी पंक्तियों की गणना करता है जहां e.id IS NOT NULL . है - चूंकि count() NULL मानों की गणना नहीं करता है।

count() के बारे में मैनुअल :

जैसा कि आप देख सकते हैं, आंतरिक रूप से भी दो अलग-अलग कार्य हैं। Andit ध्यान दिया जाना चाहिए कि count(*) थोड़ा तेज है। तो इसका उपयोग तब तक करें जब तक आपको जरूरत न हो दूसरा संस्करण। संबंधित:

आप इसका विरोध कर सकते हैं:
"लेकिन e.id PRIMARY KEY है core_employments . का , इसलिए इसे परिभाषित किया गया है NOT NULL !"

लेकिन वह सशर्त LEFT JOIN को नजरअंदाज कर देगा आपकी क्वेरी में जो अभी भी NULL . का परिचय देती है आपके NOT NULL में मान कॉलम, जहां शामिल होने की शर्तें पूरी नहीं होती हैं। संबंधित:

उस ने कहा, LEFT [OUTER] JOIN भ्रामक भी है। बाद की स्थिति

having("COUNT(e.id) = 1")

इसे एक सादे [INNER] JOIN . की तरह कार्य करने के लिए बाध्य करता है . एक बार जब आप इसे ठीक कर लेते हैं, तो आप इसे सरल भी कर सकते हैं:

having("COUNT(*) = 1")

और यदि आपको केवल इतना ही ध्यान है कि कम से कम core_employments . में एक संबंधित पंक्ति मौजूद है , having("COUNT(*) >= 1") . में अनुवाद करना , साधारण मामलों में बेहतर (स्पष्ट, तेज) तकनीक एक EXISTS अर्ध-जुड़ना :

WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pg_dump:अमान्य विकल्प -- मैं माइग्रेट करते समय

  2. पीडीओ के साथ तैयार इंसर्ट के बाद अंतिम इंसर्ट आईडी प्राप्त करें

  3. पोस्टग्रेज में एक जेसन सरणी को पंक्तियों में कैसे बदलें

  4. पंक्तियों की PL/pgSQL सरणी

  5. पोस्टग्रेज array_agg ERROR:विभिन्न आयामीता के सरणियों को जमा नहीं कर सकता