Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Operador ALL do SQL Server explicado


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.