PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Dua SQL LEFT JOINS menghasilkan hasil yang salah

Gabungan diproses dari kiri ke kanan (kecuali tanda kurung menentukan sebaliknya). Jika Anda LEFT JOIN (atau cukup JOIN , efek serupa) tiga bahan makanan untuk satu pengguna Anda mendapatkan 3 baris (1 x 3 ). Jika Anda kemudian bergabung dengan 4 pasar ikan untuk pengguna yang sama, Anda mendapatkan 12 (3 x 4 ) baris, menggandakan hitungan sebelumnya dalam hasil, bukan menambahkan untuk itu, seperti yang Anda harapkan.
Dengan demikian melipatgandakan kunjungan untuk bahan makanan dan pasar ikan.

Anda dapat membuatnya bekerja seperti ini:

SELECT u.id
     , u.account_balance
     , g.grocery_visits
     , f.fishmarket_visits
FROM   users u
LEFT   JOIN (
   SELECT user_id, count(*) AS grocery_visits
   FROM   grocery
   GROUP  BY user_id
   ) g ON g.user_id = u.id
LEFT   JOIN (
   SELECT user_id, count(*) AS fishmarket_visits
   FROM   fishmarket
   GROUP  BY user_id
   ) f ON f.user_id = u.id
ORDER  BY u.id;

Untuk mendapatkan nilai gabungan untuk satu atau beberapa pengguna, subkueri berkorelasi seperti yang disediakan @Vince baik-baik saja. Untuk seluruh tabel atau bagian utama darinya, (jauh) lebih efisien untuk menggabungkan n-tabel dan menggabungkan ke hasil sekali . Dengan cara ini, kita juga tidak perlu lagi GROUP BY di kueri luar.

grocery_visits dan fishmarket_visits adalah NULL untuk pengguna tanpa entri terkait di tabel masing-masing. Jika Anda membutuhkan 0 sebagai gantinya (atau nomor sembarang), gunakan COALESCE di bagian luar SELECT :

SELECT u.id
     , u.account_balance
     , COALESCE(g.grocery_visits   , 0) AS grocery_visits
     , COALESCE(f.fishmarket_visits, 0) AS fishmarket_visits
FROM   ...


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ubah tipe data kolom menjadi serial

  2. 'otentikasi kata sandi gagal untuk postgres pengguna'

  3. Memperbaiki tabel TOAST yang rusak

  4. Instal dan Hubungkan ke PostgreSQL 10 di Ubuntu 16.04

  5. Membandingkan Load Balancer untuk PostgreSQL