No SQL Server, você pode usar o
SOME
operador lógico para comparar um valor escalar com um conjunto de valores de coluna única retornado por uma subconsulta. Ele pode ser usado com subconsultas que possuem um conjunto de resultados de uma coluna.
O
SOME
operador é o equivalente ao ANY
operador lógico. Exemplo
Imagine que temos duas tabelas;
Cats
e Dogs
Gatos
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Cães
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
Agora vamos executar uma subconsulta usando o
ANY
operador. SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);
Resultado:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
vs ANY
Como mencionado,
SOME
é o equivalente a ANY
. Assim, podemos alterar nossa consulta para usar
ANY
em vez de SOME
. SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);
Resultado:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
vs IN
Teríamos o mesmo resultado se alterássemos a consulta para que ela usasse o
IN
operador em vez de SOME
. Aqui está usando o
IN
operador. SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Resultado:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
vs EXISTS
Poderíamos fazer a mesma coisa com o
EXISTS
operador. Aqui está usando o
EXISTS
operador. SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Resultado:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Erro 116?
Se você receber o erro 116 ao usar
SOME
, provavelmente é porque você está selecionando várias colunas em sua subconsulta. O SOME
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 = SOME (SELECT * FROM Dogs);
Resultado:
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.
Receberíamos o mesmo erro com
IN
. Se você precisar retornar várias colunas em sua subconsulta, use EXISTS
.