Di SQL Server, Anda dapat menggunakan T-SQL INTERSECT
operator untuk mengembalikan baris berbeda yang dihasilkan oleh kueri input kiri dan kanan.
Sintaks
Sintaksnya seperti ini:
{ <query_specification> | ( <query_expression> ) }
{ INTERSECT }
{ <query_specification> | ( <query_expression> ) }
Sebenarnya, dokumentasi Microsoft menyertakan EXCEPT
operator dalam definisinya, karena sintaks yang sama berlaku untuk INTERSECT
dan EXCEPT
.
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 | +---------+-----------+
Perhatikan bahwa ada seekor kucing bernama Brush dan ada juga dua anjing bernama Brush.
Kita dapat menggunakan INTERSECT
operator untuk mengembalikan hanya baris berbeda yang dihasilkan oleh kueri input kiri dan kanan.
Dengan kata lain, ini akan mengembalikan nilai apa pun yang muncul di kedua tabel, tetapi hanya akan mengembalikan satu baris (bahkan jika ada beberapa baris). Oleh karena itu, dalam kasus kami ini akan mengembalikan Brush
.
Ayo lakukan.
SELECT
CatName AS PetName
FROM Cats
INTERSECT
SELECT
DogName AS PetName
FROM Dogs;
Hasil:
Brush
Seperti disebutkan, ini mengembalikan baris yang berbeda, jadi hanya satu baris yang dikembalikan dalam kasus ini.
Ini muncul sebagai LEFT SEMI JOIN
dalam rencana eksekusi.
Ini mirip dengan melakukan hal berikut:
SELECT
DISTINCT CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Hasil:
Brush
Perhatikan bahwa saat menggunakan INTERSECT
, 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 INTERSECT
dalam kueri terdistribusi, perhatikan bahwa ini hanya dijalankan di server lokal dan tidak didorong ke server tertaut, dan karena itu dapat memengaruhi kinerja.