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

एकाधिक तालिकाओं से विदेशी कुंजी की गिनती प्राप्त करें

अगर क्वेरी में b . के बड़े हिस्से शामिल हैं और / या c पहले एकत्र करना और बाद में जुड़ना अधिक कुशल है।
मुझे उम्मीद है कि ये दोनों प्रकार काफी तेज होंगे:

SELECT a.id,
      ,COALESCE(b.ct, 0) + COALESCE(c.ct, 0) AS bc_ct
FROM   a
LEFT   JOIN (SELECT a_id, count(*) AS ct FROM b GROUP BY 1) b USING (a_id)
LEFT   JOIN (SELECT a_id, count(*) AS ct FROM c GROUP BY 1) c USING (a_id);

आपको इस संभावना का ध्यान रखना होगा कि कुछ a_id a . में बिल्कुल मौजूद नहीं हैं और / या b . count() कभी नहीं लौटाता NULL , लेकिन LEFT JOIN . के सामने यह ठंडा आराम है , जो आपको NULL . के साथ छोड़ देता है फिर भी लापता पंक्तियों के लिए मान। आपको जरूरी NULL . की तैयारी करें . COALESCE()

या यूनियन सभी a_id दोनों तालिकाओं से, कुल मिलाकर, फिर शामिल हों:

SELECT a.id
      ,COALESCE(ct.bc_ct, 0) AS bc_ct
FROM   a
LEFT   JOIN (
   SELECT a_id, count(*) AS bc_ct
   FROM (
      SELECT a_id FROM b
      UNION ALL
      SELECT a_id FROM c
      ) bc
   GROUP  BY 1
   ) ct USING (a_id);

शायद धीमा। लेकिन अभी तक प्रस्तुत समाधानों की तुलना में तेज़ है। और आप COALESCE() . के बिना भी कर सकते थे और अभी भी कोई पंक्ति नहीं ढीली है। आपको कभी-कभार NULL मिल सकता है bc_ct . के लिए मान , इस मामले में।



  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 दिनांक भाषा बदलें

  2. कच्चे बाइट्स को R . में कच्चे बाइट्स के रूप में आयात करें

  3. SQLAlchemy SSL कनेक्शन की पुष्टि करता है

  4. स्प्रिंग बूट टेस्ट के लिए एंबेडेड पोस्टग्रेज

  5. एसक्यूएल:पंक्तियों के बीच सबसे लंबी सामान्य स्ट्रिंग खोजें