No SQL Server, o
ALL
O operador pode ser usado com uma subconsulta para comparar um valor escalar com um conjunto de valores de coluna única retornado pela subconsulta. Também é verdade que o
SELECT
cláusula e UNION
operador ambos aceitam um ALL
argumento, embora este uso tenha um propósito diferente (permite duplicatas no conjunto de resultados). Abaixo estão exemplos de uso do
ALL
operador com uma subconsulta. Exemplo
Suponha que temos duas tabelas;
Cats
e Dogs
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
Agora vamos executar uma subconsulta usando o
ALL
operador. SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogName FROM Dogs);
Resultado:
(0 rows affected)
Nesse caso, nenhuma linha foi retornada. Isso ocorre porque
ALL
requer que a expressão escalar seja comparada positivamente com todas valor que é retornado pela subconsulta. Nesse caso, a subconsulta era tão ampla que todas as linhas do
Dogs
mesa foi devolvida. Isso exigiria que cada cão tivesse pelo menos um gato correspondente com o mesmo nome. Vamos alterar um pouco a subconsulta.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
Resultado:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Neste caso recebo um resultado positivo, pois todas as linhas retornadas pela subconsulta tinham uma linha correspondente no
Cats
tabela (embora apenas uma linha). Retorne o oposto
Podemos usar qualquer operador de comparação com
ALL
. Assim, poderíamos modificar os exemplos anteriores para retornar o resultado oposto, simplesmente alterando o operador igual (=) para um operador diferente de (ou <>
ou o padrão não ISO !=
). SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName <> ALL (SELECT DogName FROM Dogs);
Resultado:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 3 | Scratch | +---------+-----------+
Então, em vez de retornar todas as linhas que têm uma linha correspondente na subconsulta, retornamos todas as linhas que não tem uma linha correspondente.
E podemos fazer a mesma coisa com o outro exemplo.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName <> ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
Resultado:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 3 | Scratch | +---------+-----------+
Erro 116?
Se você receber o erro 116 ao usar
ALL
, provavelmente é porque você está selecionando várias colunas em sua subconsulta. O ALL
O operador só pode ser usado com subconsultas que tenham um conjunto de resultados de uma coluna. Aqui está um exemplo de como podemos causar esse erro.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogId, DogName FROM Dogs);
Eu simplesmente adicionei uma coluna à subconsulta.
É um erro comum ao usar o operador curinga para selecionar todas as colunas na subconsulta.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT * FROM Dogs);
De qualquer forma, o resultado é o mesmo:
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.