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.