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.