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.