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