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

Gabung Kiri-Luar di Postgres Tidak Mengembalikan Nilai untuk Null

Saya memberikan jawaban saya karena saya memiliki keraguan yang signifikan tentang jawaban lain. Anda harus berhati-hati tentang persyaratan filter. Ingat, klausa where berjalan setelah Anda bergabung . Jadi jika ada persyaratan filter di klausa where yang merujuk ke tabel gabungan non-luar, Anda telah (dalam banyak keadaan) membatalkan gabungan luar Anda. Jadi mengambil sql Anda, Tampaknya solusi paling sederhana adalah menggunakan gabungan yang tepat atau memindahkan nama tabel dengan tepat, dan kemudian memindahkan kondisi filter dari klausa where dan ke dalam klausa gabungan.

SELECT  f.faultcode, f.downloadtimeid, d.downloadtime, count(*) as faultcount 
FROM    download_time d 
RIGHT OUTER JOIN fs_fault f ON 
    f.downloadtimeid = d.id
    AND f.faultcode IN (1000,1100)
    AND f.statusid IN(2, 4)
    AND d.downloadtime BETWEEN '04/11/2011' AND '05/01/2012')
    AND d.bunoid = 166501
GROUP BY d.bunoid, f.downloadtimeid, d.downloadtime, f.faultcode

Cara lain yang menurut saya harus setara adalah

SELECT  f.faultcode, f.downloadtimeid, d.downloadtime, count(*) as faultcount 
FROM    download_time d 
RIGHT OUTER JOIN fs_fault f ON 
    f.downloadtimeid = d.id
    AND d.downloadtime BETWEEN '04/11/2011' AND '05/01/2012')
    AND d.bunoid = 166501
WHERE
    f.faultcode IN (1000,1100)
    AND f.statusid IN(2, 4)
GROUP BY d.bunoid, f.downloadtimeid, d.downloadtime, f.faultcode

Karena tidak masalah di mana persyaratan filter pada fs_fault berada. (dan mesin SQL Anda akan mengubah semuanya).

Sunting:Ini adalah SQLFiddle mendemonstrasikan pemfilteran pada klausa join vs. klausa where.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mendapatkan elemen dengan nomor unik dari array json di PostgreSQL?

  2. Pilih nilai harian terakhir bukan nol dengan zona waktu

  3. postgreSQL - psql \i :cara menjalankan skrip di jalur yang diberikan

  4. Bidang pembaruan SQL dari satu tabel dari bidang yang lain

  5. Meningkatkan kinerja ORDER BY pada jsonb cross join dengan inner join group by