Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как работи EXCEPT в SQL Server

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да върнете Unix Timestamp в SQL Server (T-SQL)

  2. Преместване на бази данни на SQL Server в облака

  3. Диагностициране на застой в SQL Server 2005

  4. Използване на оператор IF ELSE въз основа на Count за изпълнение на различни оператори Insert

  5. Как да добавите ограничение на външния ключ към съществуваща таблица в SQL Server - SQL Server / TSQL Урок, част 68