Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Klausa WHERE vs ON saat menggunakan GABUNG

Berhati-hatilah dengan perbedaan dengan gabungan luar. Kueri di mana filter b.IsApproved (di tabel kanan, Bar) ditambahkan ke ON kondisi JOIN :

SELECT * 
FROM Foo f 
LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId); 

Apakah TIDAK sama dengan menempatkan filter di WHERE klausa:

SELECT * 
FROM Foo f 
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved = 1); 

Karena untuk 'gagal' luar bergabung ke Bar (yaitu di mana tidak ada b.BarId untuk f.BarId ), ini akan meninggalkan b.IsApproved sebagai NULL untuk semua baris gabungan yang gagal tersebut, dan baris ini kemudian akan disaring.

Cara lain untuk melihat ini adalah bahwa untuk kueri pertama, LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId) akan selalu mengembalikan baris tabel KIRI, karena LEFT OUTER JOIN menjamin baris tabel KIRI akan dikembalikan bahkan jika gabungan gagal. Namun, efek penambahan (b.IsApproved = 1) ke LEFT OUTER JOIN dengan syarat adalah NULL kolom tabel kanan saat (b.IsApproved = 1) salah, yaitu sesuai dengan aturan yang sama yang biasanya diterapkan pada LEFT JOIN kondisi pada (b.BarId = f.BarId) .

Perbarui :Untuk menyelesaikan pertanyaan yang diajukan oleh Conrad, LOJ yang setara untuk filter OPSIONAL adalah:

SELECT * 
FROM Foo f 
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved IS NULL OR b.IsApproved = 1);

yaitu WHERE klausa perlu mempertimbangkan kedua kondisi apakah penggabungan gagal (NULL) dan filter harus diabaikan, dan di mana gabungan berhasil dan filter harus diterapkan. (b.IsApproved atau b.BarId dapat diuji untuk NULL )

Saya telah menggabungkan SqlFiddle di sini yang menunjukkan perbedaan antara berbagai penempatan b.IsApproved filter relatif terhadap JOIN .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Akses ditolak saat melampirkan database

  2. Daftar Hierarki Jenis Peristiwa Pemicu di SQL Server 2017

  3. Bagaimana cara menentukan literal tanggal saat menulis kueri SQL dari SQL Server yang ditautkan ke Oracle?

  4. T-SQL untuk menemukan Nama Server Jarak Jauh dari server yang ditautkan

  5. Menjelajahi SQL Server 2016 Query Store GUI