Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como o INTERSECT funciona no SQL Server


No SQL Server, você pode usar o T-SQL INTERSECT operador para retornar linhas distintas que são geradas pelas consultas de entrada esquerda e direita.

Sintaxe


A sintaxe fica assim:
{ <query_specification> | ( <query_expression> ) }   
{ INTERSECT }  
{ <query_specification> | ( <query_expression> ) }

Na verdade, a documentação da Microsoft inclui o EXCEPT operador em sua definição, pois a mesma sintaxe se aplica a INTERSECT e EXCEPT .

A sintaxe da Microsoft é assim:
{ <query_specification> | ( <query_expression> ) }   
{ EXCEPT | INTERSECT }  
{ <query_specification> | ( <query_expression> ) }

Exemplo


Imagine que você tenha duas tabelas; Cats e Dogs .

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

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

Observe que existe um gato chamado Brush e também dois cachorros chamados Brush.

Podemos usar o INTERSECT para retornar apenas as linhas distintas que são geradas pelas consultas de entrada esquerda e direita.

Em outras palavras, ele retornará quaisquer valores que apareçam nas duas tabelas, mas retornará apenas uma linha (mesmo que haja várias linhas). Portanto, no nosso caso, ele retornará Brush .

Vamos fazê-lo.
SELECT 
    CatName AS PetName
FROM Cats
INTERSECT
SELECT 
    DogName AS PetName
FROM Dogs;

Resultado:
Brush

Como mencionado, ele retorna linhas distintas, portanto, apenas uma linha é retornada neste caso.

Isso aparece como um LEFT SEMI JOIN no plano de execução.

É semelhante a fazer o seguinte:
SELECT 
    DISTINCT CatName
FROM Cats c 
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);

Resultado:
Brush

Observe que ao usar INTERSECT , o número e a ordem das colunas devem ser os mesmos em todas as consultas. Além disso, os tipos de dados devem ser compatíveis. Na verdade, eles não precisam ser iguais, mas devem ser comparáveis ​​por meio de conversão implícita.

Além disso, ao comparar valores de coluna para determinar DISTINCT linhas, duas NULL os valores são considerados iguais.

Se você pretende usar INTERSECT em consultas distribuídas, observe que ele é executado apenas no servidor local e não enviado por push para o servidor vinculado e, portanto, isso pode afetar o desempenho.