Можете да използвате T-SQL EXCEPT
оператор в SQL Server, за да върне отделни редове от лявата входна заявка, които не се извеждат от дясната входна заявка.
Синтаксис
Синтаксисът е така:
<предварителен{ <query_specification> | ( <query_expression> ) }
{ EXCEPT }
{ <query_specification> | ( <query_expression> ) }
Всъщност документацията на Microsoft включва INTERSECT
оператор в неговата дефиниция, тъй като същият синтаксис се прилага за EXCEPT
и INTERSECT
.
Синтаксисът на Microsoft е така:
<предварителен{ <query_specification> | ( <query_expression> ) }
{ EXCEPT | INTERSECT }
{ <query_specification> | ( <query_expression> ) }
Пример
Представете си, че имате две маси; Cats
и Dogs
.
Cats
+--------+-----------+| CatId | Име на котка ||---------+-----------|| 1 | Четка || 2 | Scarcat || 3 | Трептене || 4 | Трептене |+--------+-----------+
Dogs
+--------+-----------+| DogId | Име на куче ||---------+-----------|| 1 | Елп || 2 | Woofer || 3 | Четка || 4 | Четка |+--------+-----------+
Можем да използваме EXCEPT
оператор, за да върне само отделните редове от лявата входна заявка, които не са изведени от дясната входна заявка.
Ето един пример.
SELECT CatName FROM Cats
EXCEPT
SELECT DogName FROM Dogs;
Резултат:
+-----------+| Име на котка ||-----------|| Трептене || Scarcat |+-----------+
Така че получаваме само стойности, които се появяват в Cats
таблица, които също не се показват в Dogs
маса. Както споменахме, той връща отделни редове, така че само един ред се връща за Flutter
.
Можем също да го превключим и да поставим Dogs
таблица вляво и Cats
вдясно.
SELECT DogName FROM Dogs
EXCEPT
SELECT CatName FROM Cats;
Резултат:
+-----------+| Име на куче ||-----------|| Woofer || Елп |+-----------+
EXCEPT
операторът се появява като LEFT ANTI SEMI JOIN
в плана за изпълнение.
Така че първият ни пример е подобен на това да направим следното:
SELECT
DISTINCT CatName
FROM Cats c
WHERE NOT EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Резултат:
+-----------+| Име на котка ||-----------|| Трептене || Scarcat |+-----------+
Имайте предвид, че когато използвате EXCEPT
, броят и редът на колоните трябва да са еднакви във всички заявки. Освен това типовете данни трябва да са съвместими. Те всъщност не трябва да са еднакви, но трябва да са сравними чрез имплицитно преобразуване.
Също така, когато се сравняват стойности на колони за определяне на DISTINCT
редове, два NULL
стойностите се считат за равни.
Ако възнамерявате да използвате EXCEPT
в разпределените заявки имайте предвид, че се изпълнява само на локалния сървър, а не се прехвърля към свързания сървър и следователно това може да повлияе на производителността.