sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo funciona INTERSECT en SQL Server

En SQL Server, puede usar T-SQL INTERSECT operador para devolver filas distintas que son generadas por las consultas de entrada izquierda y derecha.

Sintaxis

La sintaxis es así:

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

En realidad, la documentación de Microsoft incluye el EXCEPT operador en su definición, ya que la misma sintaxis se aplica a INTERSECT y EXCEPT .

La sintaxis de Microsoft es así:

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

Ejemplo

Imagina que tienes dos mesas; Cats y Dogs .

Cats

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

Dogs

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

Fíjate que hay un gato llamado Brush y también hay dos perros llamados Brush.

Podemos usar el INTERSECT operador para devolver solo las filas distintas que se generan por las consultas de entrada izquierda y derecha.

En otras palabras, devolverá cualquier valor que aparezca en ambas tablas, pero solo devolverá una fila (incluso si hay varias filas). Por tanto, en nuestro caso devolverá Brush .

Hagámoslo.

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

Resultado:

Brush

Como se mencionó, devuelve filas distintas, por lo que solo se devuelve una fila en este caso.

Esto aparece como LEFT SEMI JOIN en el plan de ejecución.

Es similar a hacer lo siguiente:

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

Resultado:

Brush

Tenga en cuenta que al usar INTERSECT , el número y el orden de las columnas debe ser el mismo en todas las consultas. Además, los tipos de datos deben ser compatibles. En realidad, no tienen que ser iguales, pero deben ser comparables a través de una conversión implícita.

Además, al comparar valores de columna para determinar DISTINCT filas, dos NULL los valores se consideran iguales.

Si tiene la intención de utilizar INTERSECT en las consultas distribuidas, tenga en cuenta que solo se ejecuta en el servidor local y no se envía al servidor vinculado, por lo que esto podría afectar el rendimiento.