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

दो SQL लेफ्ट जॉइन गलत परिणाम देते हैं

जुड़ने को बाएं से दाएं संसाधित किया जाता है (जब तक कि कोष्ठक अन्यथा निर्देशित न करें)। यदि आप LEFT JOIN (या सिर्फ JOIN , समान प्रभाव) एक उपयोगकर्ता को तीन किराने का सामान आपको 3 पंक्तियाँ मिलती हैं (1 x 3 ) यदि आप एक ही उपयोगकर्ता के लिए 4 फिशमार्केट में शामिल होते हैं, तो आपको 12 मिलते हैं (3 x 4 ) पंक्तियाँ, गुणा करना परिणाम में पिछली गणना, न कि जोड़ने इसके लिए, जैसा आपने उम्मीद की होगी।
इस प्रकार किराने का सामान और मछली बाजार के लिए यात्राओं को समान रूप से गुणा करना।

आप इसे इस तरह काम कर सकते हैं:

SELECT u.id
     , u.account_balance
     , g.grocery_visits
     , f.fishmarket_visits
FROM   users u
LEFT   JOIN (
   SELECT user_id, count(*) AS grocery_visits
   FROM   grocery
   GROUP  BY user_id
   ) g ON g.user_id = u.id
LEFT   JOIN (
   SELECT user_id, count(*) AS fishmarket_visits
   FROM   fishmarket
   GROUP  BY user_id
   ) f ON f.user_id = u.id
ORDER  BY u.id;

एक या कुछ उपयोगकर्ताओं के लिए समेकित मान प्राप्त करने के लिए, सहसंबंधित उपश्रेणियां जैसे @Vince प्रदान किया गया ठीक है। एक संपूर्ण तालिका या उसके प्रमुख भागों के लिए, n-तालिकाओं को एकत्रित करना और परिणाम में शामिल होना एक बार अधिक कुशल है। . इस तरह, हमें किसी अन्य GROUP BY . की भी आवश्यकता नहीं है बाहरी क्वेरी में।

grocery_visits और fishmarket_visits हैं NULL उपयोगकर्ताओं के लिए संबंधित तालिकाओं में किसी भी संबंधित प्रविष्टि के बिना। अगर आपको 0 चाहिए इसके बजाय (या कोई मनमानी संख्या), COALESCE . का उपयोग करें बाहरी में SELECT :

SELECT u.id
     , u.account_balance
     , COALESCE(g.grocery_visits   , 0) AS grocery_visits
     , COALESCE(f.fishmarket_visits, 0) AS fishmarket_visits
FROM   ...


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कैसे चुप करने के लिए Ubuntu में Postgresql के माध्यम से स्थापित करें। डॉकरफाइल?

  2. क्लाउड में पोस्टग्रेएसक्यूएल क्लस्टर्स के नियर-ज़ीरो डाउनटाइम ऑटोमेटेड अपग्रेड्स (भाग II)

  3. मूडल पोस्टग्रेएसक्यूएल डेटाबेस की स्वचालित विफलता

  4. एकाधिक पंक्तियों को सम्मिलित करते समय डुप्लिकेट के साथ क्या होता है?

  5. पोस्टग्रेस्क्ल में फ़ंक्शन, प्रक्रिया, ट्रिगर स्रोत कोड कैसे प्रदर्शित करें?