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

Hitung baris setelah bergabung dengan tiga tabel di PostgreSQL

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. fungsi plpgsql yang mengembalikan beberapa kolom dipanggil beberapa kali

  2. Postgresql:Tidak dapat mengakses file « $libdir/postgis-2.1 » tidak ada file atau direktori seperti itu

  3. Bagaimana cara mengecualikan fungsi PL/pgSQL dalam ekspor?

  4. Mengapa postgres tidak membuat database?

  5. Bagaimana cara UPSERT (MERGE, INSERT ... ON DUPLICATE UPDATE) di PostgreSQL?