Entendendo os operadores SOME, ANY e ALL
Introdução
Este artigo fornece uma demonstração sobre como funciona os operadores de comparação: SOME, ANY e ALL.
As consultas e subconsultas que utilizam estes operadores de comparação SQL-ISO (padrão), retornam valores numéricos maior ou igual à zero para diversas funcionalidades, como cláusulas GROUP BY, HAVING ou subconsultas declaradas com EXISTS.
O objetivo é facilitar a execução sobre a comparação de um ou mais registros, através de valores escalares, que atendam à uma condição booleana.
O conteúdo é parte das habilidades avaliadas no exame 94-364: MTA Database Fundamentals.
Construindo Ambiente para Teste
Para apresentar como funciona cada operador, é necessário uma tabela onde possamos obter dados númericos diretamente por uma coluna ou através de um resultado de agrupamento COUNT, SUM ou AVG.
Segue abaixo o script T-SQL para criação de uma tabela simples para esta demonstração:
CREATE TABLE TB_TEST (
ID_CLIENT smallint IDENTITY(1,1) NOT NULL,
NM_CLIENT varchar(20) NOT NULL
) ON [PRIMARY]
GO
INSERT INTO TB_TEST VALUES ('CLIENT 1');
INSERT INTO TB_TEST VALUES ('CLIENT 2');
INSERT INTO TB_TEST VALUES ('CLIENT 3');
GO
SELECT * FROM TB_TEST;
GO
Veja abaixo a imagem desta tabela disponibilizada:
Operadores "SOME" e "ANY"
Os operadores SOME e ANY são semelhantes e lembram "um pouco" a instrução "IN", mas retornam um valor booleano "True" ou "False". Os valores para comparação sempre devem ser baseados em uma única coluna.
Ao menos um dos valores deve atender a condição indicada.
Segue abaixo um script SQL demonstrando o funcionamento destes operadores:
DECLARE @VALOR int = 3
--É "Menor" que "Algum" dos números desta coluna
SELECT IIF((@VALOR < SOME (SELECT ID_CLIENT FROM TB_TEST)), 'É', 'NÃO É')
--É "Diferente" que "Algum" dos números desta coluna
SELECT IIF((@VALOR <> SOME (SELECT ID_CLIENT FROM TB_TEST)), 'É diferente', 'É igual')
--É "Menor" que "Qualquer" dos números desta coluna
SELECT IIF((@VALOR < ANY (SELECT ID_CLIENT FROM TB_TEST)), 'É', 'NÃO É')
--É "Diferente" que "Qualquer" dos números desta coluna
SELECT IIF((@VALOR <> ANY (SELECT ID_CLIENT FROM TB_TEST)), 'É diferente', 'É igual')
GO
Veja abaixo a imagem com os resultados comparativos entre SOME e ANY, baseados na variável @VALOR =3:
https://social.technet.microsoft.com/Forums/getfile/661628
Veja abaixo a imagem com os resultados comparativos entre SOME e ANY, agora com base na variável @VALOR =2:
https://social.technet.microsoft.com/Forums/getfile/661629
Operador "ALL"
Utilizando o oeprador "ALL", deverá ser verificado se o valor está entre um dos registros armazenados na coluna indicada.
Também possui um retorno booleano, semelhante à SOME e ANY, porém neste caso somente retornará o resultado "True" quando encontrar ao menos um valor comparado entre o conjunto de uma coluna.
Você pode obter os mesmos resultados com o operador "<> ALL" semelhante à cláusula "NOT IN".
Segue abaixo um script SQL demonstrando o funcionamento destes operadores:
DECLARE @VALOR int = 1
--É "Menor" que "Todos" os números desta coluna
SELECT IIF((@VALOR < ALL (SELECT ID_CLIENT FROM TB_TEST)), 'É', 'NÃO É')
--É "Diferente" que "Todos" os números desta coluna
SELECT IIF((@VALOR <> ALL (SELECT ID_CLIENT FROM TB_TEST)), 'Sim. É diferente', 'Não. É igual')
GO
Veja abaixo a imagem com os resultados comparativos do operador ALL baseado na variável @VALOR =1:
https://social.technet.microsoft.com/Forums/getfile/661676
Veja abaixo a imagem com os resultados comparativos do operador ALL baseado na variável @VALOR = 0:
https://social.technet.microsoft.com/Forums/getfile/661677
Referências
- Operadores de comparação modificados por ANY, SOME ou ALL
- SOME | ANY (Transact-SQL)
- ALL (Transact-SQL)
- MS Learning: 94-364 - MTA Database Fundamentals