अपने तर्क को सरल बनाने के लिए, पहले एकत्र करें, बाद में शामिल हों।
लापता विवरण का अनुमान लगाते हुए, यह क्वेरी आपको सटीक गणना देगी कि प्रत्येक उपयोगकर्ता को table1
में कितनी बार संदर्भित किया गया था और table2
क्रमशः सभी उपयोगकर्ताओं के लिए :
SELECT *
FROM users u
LEFT JOIN (
SELECT updated_by_id AS id, count(*) AS t1_ct
FROM table1
GROUP BY 1
) t1 USING (id)
LEFT JOIN (
SELECT updated_by_id AS id, count(*) AS t2_ct
FROM table2
GROUP BY 1
) t2 USING (id);
विशेष रूप से, एक साथ जुड़ने पर कई 1-n रिश्तों को एक-दूसरे से गुणा करने से बचें:
एकल या कुछ उपयोगकर्ताओं . को पुनः प्राप्त करने के लिए केवल, LATERAL
जॉइन तेजी से होगा (पोस्टग्रेज 9.3+):
SELECT *
FROM users u
LEFT JOIN LATERAL (
SELECT count(*) AS t1_ct
FROM table1
WHERE updated_by_id = u.id
) ON true
LEFT JOIN LATERAL (
SELECT count(*) AS t2_ct
FROM table2
WHERE updated_by_id = u.id
) ON true
WHERE u.id = 100;
कथित अंतर समझाएं
आपके द्वारा रिपोर्ट की गई विशेष बेमेल एक FULL OUTER JOIN
:
तो आपको लापता मैचों के लिए संबंधित दूसरी तरफ NULL मान मिलते हैं। count()
NULL मानों की गणना नहीं करता है। तो आप u1.id=100
. पर फ़िल्टर करते हैं या नहीं, इसके आधार पर आप एक अलग परिणाम प्राप्त कर सकते हैं या u2.id=100
।
यह केवल समझाने के लिए है, आपको FULL JOIN
की आवश्यकता नहीं है यहां। इसके बजाय प्रस्तुत विकल्पों का प्रयोग करें।