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

Bagaimana KECUALI Bekerja di SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CTE loop tak terbatas dengan OPTION (maxrecursion 0)

  2. SYSDATETIME() vs GETDATE() di SQL Server:Apa Perbedaannya?

  3. LEFT() vs SET TEXTSIZE di SQL Server:Apa Bedanya?

  4. Tidak Dapat Menyelesaikan Konflik Pengumpulan

  5. Cara Mengembalikan Kunci Duplikat dari Dokumen JSON di SQL Server