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.