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

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

В SQL Server можете да използвате T-SQL INTERSECT оператор за връщане на различни редове, които се извеждат както от лявата, така и от дясната входни заявки.

Синтаксис

Синтаксисът е така:

<предварителен { <query_specification> | ( <query_expression> ) } { INTERSECT } { <query_specification> | ( <query_expression> ) }

Всъщност документацията на Microsoft включва EXCEPT оператор в неговата дефиниция, тъй като същият синтаксис се прилага за INTERSECT и EXCEPT .

Синтаксисът на 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 | Четка |+--------+-----------+

Забележете, че има котка, наречена Brush, и има две кучета, наречени Brush.

Можем да използваме INTERSECT оператор, за да върне само отделните редове, които се извеждат както от лявата, така и от дясната входни заявки.

С други думи, той ще върне всички стойности, които се появяват и в двете таблици, но ще върне само един ред (дори ако има няколко реда). Следователно в нашия случай той ще върне Brush .

Нека го направим.

SELECT 
    CatName AS PetName
FROM Cats
INTERSECT
SELECT 
    DogName AS PetName
FROM Dogs; 

Резултат:

Четка

Както споменахме, той връща различни редове, така че в този случай се връща само един ред.

Това се появява като LEFT SEMI JOIN в плана за изпълнение.

Това е подобно на това да направите следното:

SELECT 
    DISTINCT CatName
FROM Cats c 
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName); 

Резултат:

Четка

Имайте предвид, че когато използвате INTERSECT , броят и редът на колоните трябва да са еднакви във всички заявки. Освен това типовете данни трябва да са съвместими. Те всъщност не трябва да са еднакви, но трябва да са сравними чрез имплицитно преобразуване.

Също така, когато се сравняват стойности на колони за определяне на DISTINCT редове, две NULL стойностите се считат за равни.

Ако възнамерявате да използвате INTERSECT в разпределените заявки имайте предвид, че се изпълнява само на локалния сървър, а не се изпраща към свързания сървър и следователно това може да повлияе на производителността.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вземете записите от миналия месец в SQL сървър

  2. Трябва да декларира грешката на променливата @myvariable с ADO параметризирана заявка

  3. Как да актуализирате статистиката на SQL Server за големи таблици

  4. 3 начина за връщане на броя на редовете във всеки дял в SQL Server (T-SQL)

  5. Как да изчисля текущата сума в SQL, без да използвам курсор?