अगर क्वेरी में 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 . के लिए मान , इस मामले में।