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

Baris duplikat SQL dengan beberapa gabungan kiri

Anda mengalami fanout agregat dalam kueri di atas.

Hal ini terjadi karena ada

  • penggabungan 1-1 atau 1-N antara aaa &bbb
  • ada gabungan 1-N antara bbb &ccc

Gabung terakhir membuat M duplikat untuk baris yang ada di bbb jika mereka bergabung ke baris M melalui gabung ke ccc

Untuk memperbaiki kesalahan, bagi kueri menjadi dua CTE &gabungkan hasilnya.

WITH agg_bb AS (
SELECT aa.id, sum(bb.count)
FROM aaaa aa
LEFT JOIN bbbb bb ON bb.aa_id = aa.id
GROUP BY aa.id
)
, agg_cc AS (SELECT aa.id, count(DISTINCT cc.id)
FROM aaaa aa
LEFT JOIN bbbb bb ON bb.aa_id = aa.id
LEFT JOIN cccc cc ON cc.bb_id = bb.id
GROUP BY aa.id
)
SELECT * FROM agg_bb JOIN agg_cc USING (id)

Secara umum, untuk menghindari fan out, hanya terapkan operasi agregat ke kolom dari relasi paling kanan dalam serangkaian gabungan. Jika Anda menemukan Anda menggabungkan kolom dari tabel tengah, pisahkan kueri seperti yang telah saya lakukan di atas. Hanya fungsi berikut yang invarian di seluruh fan out:COUNT DISTINCT , MIN , MAX




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kesalahan sintaksis PostgreSQL dalam kueri berparameter pada tanggal $1

  2. Initdb PostgreSQL (Inisialisasi Basis Data) di Linux

  3. Masalah konkurensi dengan psycopg2, Redshift, dan unittest

  4. Masalah dengan nama kolom berisi titik dua di PostgreSQL

  5. cara mengonversi menit integer ke interval di postgres