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