Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak INTERSECT działa w SQL Server

W SQL Server możesz użyć T-SQL INTERSECT operatora, aby zwrócić różne wiersze, które są wyprowadzane zarówno przez lewe, jak i prawe zapytanie wejściowe.

Składnia

Składnia wygląda tak:

{ <query_specification> | ( <query_expression> ) }   
{ INTERSECT }  
{ <query_specification> | ( <query_expression> ) }

W rzeczywistości dokumentacja Microsoft zawiera EXCEPT operator w swojej definicji, ponieważ ta sama składnia dotyczy INTERSECT i EXCEPT .

Składnia Microsoftu wygląda następująco:

{ <query_specification> | ( <query_expression> ) }   
{ EXCEPT | INTERSECT }  
{ <query_specification> | ( <query_expression> ) }

Przykład

Wyobraź sobie, że masz dwa stoły; Cats i Dogs .

Cats

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Brush     |
| 2       | Scarcat   |
| 3       | Flutter   |
| 4       | Flutter   |
+---------+-----------+

Dogs

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Yelp      |
| 2       | Woofer    |
| 3       | Brush     |
| 4       | Brush     |
+---------+-----------+

Zauważ, że jest kot o imieniu Pędzel i są też dwa psy o imieniu Pędzel.

Możemy użyć INTERSECT operatora, aby zwrócić tylko odrębne wiersze, które są wyprowadzane przez zarówno lewe, jak i prawe zapytanie wejściowe.

Innymi słowy, zwróci wszystkie wartości, które pojawiają się w obu tabelach, ale zwróci tylko jeden wiersz (nawet jeśli jest wiele wierszy). Dlatego w naszym przypadku zwróci Brush .

Zróbmy to.

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

Wynik:

Brush

Jak wspomniano, zwraca różne wiersze, więc w tym przypadku zwracany jest tylko jeden wiersz.

Pojawia się jako LEFT SEMI JOIN w planie wykonania.

Jest to podobne do wykonywania następujących czynności:

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

Wynik:

Brush

Zwróć uwagę, że używając INTERSECT , liczba i kolejność kolumn muszą być takie same we wszystkich zapytaniach. Ponadto typy danych muszą być zgodne. W rzeczywistości nie muszą być takie same, ale muszą być porównywalne poprzez niejawną konwersję.

Również podczas porównywania wartości kolumn w celu określenia DISTINCT wiersze, dwa NULL wartości są uważane za równe.

Jeśli zamierzasz użyć INTERSECT w zapytaniach rozproszonych należy pamiętać, że jest on wykonywany tylko na serwerze lokalnym i nie jest przesyłany do serwera połączonego, co może wpłynąć na wydajność.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Napraw komunikat 529 „Wyraźna konwersja typu danych typu int do xml jest niedozwolona” w SQL Server

  2. Część czasowa pola DateTime w SQL

  3. Uzyskaj AVG ignorując wartości Null lub Zero

  4. SYSDATETIMEOFFSET() Przykłady w SQL Server (T-SQL)

  5. SQL Server — co się dzieje po zaktualizowaniu wiersza w tabeli?