Anda dapat menggunakan T-SQL EXCEPT
operator di SQL Server untuk mengembalikan baris berbeda dari kueri input kiri yang tidak dikeluarkan oleh kueri input kanan.
Sintaks
Sintaksnya seperti ini:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT }
{ <query_specification> | ( <query_expression> ) }
Sebenarnya, dokumentasi Microsoft menyertakan INTERSECT
operator dalam definisinya, karena sintaks yang sama berlaku untuk EXCEPT
dan INTERSECT
.
Sintaks Microsoft seperti ini:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT | INTERSECT }
{ <query_specification> | ( <query_expression> ) }
Contoh
Bayangkan Anda memiliki dua tabel; Cats
dan Dogs
.
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Brush | | 2 | Scarcat | | 3 | Flutter | | 4 | Flutter | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Yelp | | 2 | Woofer | | 3 | Brush | | 4 | Brush | +---------+-----------+
Kita dapat menggunakan EXCEPT
operator untuk mengembalikan hanya baris yang berbeda dari kueri input kiri yang tidak dikeluarkan oleh kueri input kanan.
Ini contohnya.
SELECT CatName FROM Cats
EXCEPT
SELECT DogName FROM Dogs;
Hasil:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Jadi kami hanya mendapatkan nilai yang muncul di Cats
tabel yang juga tidak muncul di Dogs
meja. Seperti disebutkan, ini mengembalikan baris yang berbeda, jadi hanya satu baris yang dikembalikan untuk Flutter
.
Kami juga dapat mengubahnya dan menempatkan Dogs
tabel di sebelah kiri dan Cats
di sebelah kanan.
SELECT DogName FROM Dogs
EXCEPT
SELECT CatName FROM Cats;
Hasil:
+-----------+ | DogName | |-----------| | Woofer | | Yelp | +-----------+
EXCEPT
operator muncul sebagai LEFT ANTI SEMI JOIN
dalam rencana eksekusi.
Jadi contoh pertama kita mirip dengan melakukan hal berikut:
SELECT
DISTINCT CatName
FROM Cats c
WHERE NOT EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Hasil:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Perhatikan bahwa saat menggunakan EXCEPT
, jumlah dan urutan kolom harus sama di semua kueri. Juga, tipe data harus kompatibel. Sebenarnya tidak harus sama, tetapi harus sebanding melalui konversi implisit.
Juga, saat membandingkan nilai kolom untuk menentukan DISTINCT
baris, dua NULL
nilai dianggap sama.
Jika Anda ingin menggunakan EXCEPT
dalam kueri terdistribusi, perhatikan bahwa ini hanya dijalankan di server lokal dan tidak didorong ke server tertaut, dan karena itu dapat memengaruhi kinerja.