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

Operador SOME do SQL Server explicado


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 .