Puede usar T-SQL EXCEPT
operador en SQL Server para devolver filas distintas de la consulta de entrada de la izquierda que no son generadas por la consulta de entrada de la derecha.
Sintaxis
La sintaxis es así:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT }
{ <query_specification> | ( <query_expression> ) }
En realidad, la documentación de Microsoft incluye el INTERSECT
operador en su definición, ya que la misma sintaxis se aplica a EXCEPT
y INTERSECT
.
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 | +---------+-----------+
Podemos usar el EXCEPT
operador para devolver solo las filas distintas de la consulta de entrada de la izquierda que no son generadas por la consulta de entrada de la derecha.
He aquí un ejemplo.
SELECT CatName FROM Cats
EXCEPT
SELECT DogName FROM Dogs;
Resultado:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Entonces solo obtenemos valores que aparecen en Cats
que no aparecen en la tabla Dogs
mesa. Como se mencionó, devuelve filas distintas, por lo que solo se devuelve una fila para Flutter
.
También podemos cambiarlo y poner los Dogs
mesa a la izquierda y Cats
a la derecha.
SELECT DogName FROM Dogs
EXCEPT
SELECT CatName FROM Cats;
Resultado:
+-----------+ | DogName | |-----------| | Woofer | | Yelp | +-----------+
El EXCEPT
el operador aparece como LEFT ANTI SEMI JOIN
en el plan de ejecución.
Así que nuestro primer ejemplo es similar a hacer lo siguiente:
SELECT
DISTINCT CatName
FROM Cats c
WHERE NOT EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Resultado:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Tenga en cuenta que al usar EXCEPT
, 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 EXCEPT
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.