Можете да използвате 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 в разпределените заявки имайте предвид, че се изпълнява само на локалния сървър, а не се прехвърля към свързания сървър и следователно това може да повлияе на производителността.