Untuk menyederhanakan logika Anda, gabungkan dulu, gabung nanti.
Menebak detail yang hilang, kueri ini akan memberi Anda jumlah yang tepat, berapa kali setiap pengguna direferensikan di table1
dan table2
masing-masing untuk semua pengguna :
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);
Secara khusus, hindari beberapa hubungan 1-n yang saling mengalikan saat digabungkan:
Untuk mengambil satu atau beberapa pengguna saja, LATERAL
bergabung akan lebih cepat (Postgres 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;
Jelaskan perbedaan yang dirasakan
Ketidakcocokan tertentu yang Anda laporkan disebabkan oleh spesifikasi FULL OUTER JOIN
:
Jadi Anda mendapatkan nilai NULL yang ditambahkan di sisi lain masing-masing untuk kecocokan yang hilang. count()
tidak menghitung nilai NULL. Jadi Anda bisa mendapatkan hasil yang berbeda tergantung pada apakah Anda memfilter u1.id=100
atau u2.id=100
.
Ini hanya untuk menjelaskan, Anda tidak perlu FULL JOIN
di sini. Gunakan alternatif yang disajikan sebagai gantinya.