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

Apa perbedaan dalam dua kueri ini karena mendapatkan dua set hasil yang berbeda?

Tidak ada bedanya jika Anda melakukan ini di INNER JOIN.

Namun, bila Anda menggunakan LEFT atau RIGHT JOIN, tidak buat perbedaan apakah Anda memasukkan filter tambahan ke dalam klausa GABUNG atau ke dalam klausa WHERE.

Saat Anda memasukkan filter ke dalam klausa WHERE, SQL Server melakukan penggabungan terlebih dahulu, lalu sepenuhnya memfilter baris yang tidak sesuai dengan filter.
--> ini akan mengurangi jumlah baris yang dikembalikan

Saat Anda memasukkan filter ke GABUNG, SQL Server melakukan pemfilteran selama penggabungan, tetapi hanya pada tabel tempat Anda meletakkan filter.
Anda masih mendapatkan semua baris dari tabel lain, tetapi hanya tabel yang memiliki data dari tabel terfilter tempat filter cocok.
--> ini tidak akan mengurangi jumlah baris, tetapi kolom dengan data dari tabel filter akan kosong di lebih banyak baris

Susah dijelasin... biar lebih jelas, ini contohnya:

Ambil contoh data dari Jawaban RedFilter :

CREATE TABLE [dbo].[t1](
    [ID] [int] NULL,
    [StatusID] [int] NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[t2](
    [ID] [int] NULL
) ON [PRIMARY]
INSERT INTO t1 (ID, StatusID) VALUES (1, 10)
INSERT INTO t1 (ID, StatusID) VALUES (2, 11)
INSERT INTO t1 (ID, StatusID) VALUES (3, 12)
INSERT INTO t1 (ID, StatusID) VALUES (4, 12)
INSERT INTO t2 (ID) VALUES (1)
INSERT INTO t2 (ID) VALUES (3)
INSERT INTO t2 (ID) VALUES (5)

...dan jalankan kueri berikut di atasnya:

/* this returns four rows, but only two will have data 
from the second table in the second column */
SELECT t1.ID, t2.ID
FROM t1 
LEFT JOIN t2 ON t1.Id = t2.Id 

/* this returns only one row: the one where t2.ID = 1 */
SELECT t1.ID, t2.ID
FROM t1 
LEFT JOIN t2 ON t1.Id = t2.Id 
WHERE t2.ID = 1 

/* this returns four rows as in the first query, but only one 
row will have data in the second column: the one where t2.ID = 1 */
SELECT t1.ID, t2.ID
FROM t1 
LEFT JOIN t2 ON t1.Id = t2.Id 
AND t2.ID = 1 

Perhatikan hasil yang berbeda seperti yang ditunjukkan dalam komentar.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa kueri SQL dengan fungsi VBA berjalan sangat lambat?

  2. Startup EF yang sangat lambat - 15 menit

  3. Menghapus Kunci Utama (Indeks Berkelompok) untuk meningkatkan kinerja Sisipan

  4. Membalikkan karakter dalam string dengan bahasa campuran Kiri-ke-kanan dan Kanan-ke-kiri menggunakan SQL?

  5. Harga dibandingkan dengan beberapa toko di sql