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

Cómo funciona EXCEPTO en SQL Server

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.