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

Explicación del operador ALL de SQL Server

En SQL Server, ALL El operador se puede usar con una subconsulta para comparar un valor escalar con un conjunto de valores de una sola columna devuelto por la subconsulta.

También es cierto que el SELECT cláusula y UNION ambos operadores aceptan un ALL argumento, aunque este uso tiene un propósito diferente (permite duplicados en el conjunto de resultados).

A continuación se muestran ejemplos del uso de ALL operador con una subconsulta.

Ejemplo

Supongamos que tenemos dos mesas; Cats y Dogs

Cats

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+

Dogs

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
| 3       | Wag       |
+---------+-----------+

Ahora ejecutemos una subconsulta usando ALL operador.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ALL (SELECT DogName FROM Dogs);

Resultado:

(0 rows affected)

En este caso, no se devolvieron filas. Esto se debe a que ALL requiere que la expresión escalar se compare positivamente con every valor que devuelve la subconsulta.

En este caso, la subconsulta era tan amplia que todas las filas de Dogs se devolvió la mesa. Esto requeriría que cada perro tuviera al menos un gato correspondiente con el mismo nombre.

Cambiemos ligeramente la subconsulta.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ALL (
    SELECT DogName FROM Dogs 
    WHERE DogId = 2
    );

Resultado:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

En este caso obtengo un resultado positivo, porque todas las filas devueltas por la subconsulta tenían una fila correspondiente en Cats tabla (aunque solo una fila).

Regresar el Opuesto

Podemos usar cualquier operador de comparación con ALL . Así que podríamos modificar los ejemplos anteriores para devolver el resultado opuesto, simplemente cambiando el operador igual (=) a un operador diferente a (ya sea <> o el estándar no ISO != ).

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName <> ALL (SELECT DogName FROM Dogs);

Resultado:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 3       | Scratch   |
+---------+-----------+

Entonces, en lugar de devolver todas las filas que tienen una fila correspondiente en la subconsulta, devolvemos todas las filas que no tener una fila correspondiente.

Y podemos hacer lo mismo con el otro ejemplo.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName <> ALL (
    SELECT DogName FROM Dogs 
    WHERE DogId = 2
    );

Resultado:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 3       | Scratch   |
+---------+-----------+

¿Error 116?

Si obtiene el error 116 al usar ALL , probablemente se deba a que está seleccionando varias columnas en su subconsulta. Los ALL El operador solo se puede usar con subconsultas que tienen un conjunto de resultados de una columna.

Aquí hay un ejemplo de cómo podemos causar este error.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ALL (SELECT DogId, DogName FROM Dogs);

Simplemente agregué una columna a la subconsulta.

Es un error común cuando se usa el operador comodín para seleccionar todas las columnas en la subconsulta.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ALL (SELECT * FROM Dogs);

De cualquier manera, el resultado es el mismo:

Msg 116, Level 16, State 1, Line 5
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.