sql >> Base de Datos >  >> RDS >> Sqlserver

Explicación del operador SOME de SQL Server

En SQL Server, puede usar SOME operador lógico para comparar un valor escalar con un conjunto de valores de una sola columna devuelto por una subconsulta.

Se puede usar con subconsultas que tienen un conjunto de resultados de una columna.

El SOME operador es el equivalente de ANY operador lógico.

Ejemplo

Imagina que tenemos dos mesas; Cats y Dogs

Gatos

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+

Perros

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
| 3       | Wag       |
+---------+-----------+

Ahora ejecutemos una subconsulta usando 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 se mencionó, SOME es el equivalente de ANY .

Entonces podríamos cambiar nuestra consulta para usar ANY en lugar de SOME .

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);

Resultado:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

SOME frente a IN

Obtendríamos el mismo resultado si tuviéramos que cambiar la consulta para que use el IN operador en lugar de SOME .

Aquí está usando el IN operador.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName IN (SELECT DogName FROM Dogs);

Resultado:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

SOME vs EXISTS

Podríamos hacer lo mismo con EXISTS operador.

Aquí está usando 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    |
+---------+-----------+

¿Error 116?

Si obtiene el error 116 al usar SOME , probablemente se deba a que está seleccionando varias columnas en su subconsulta. El SOME El operador solo se puede usar con subconsultas que tienen un conjunto de resultados de una columna.

Aquí hay un ejemplo de cómo podemos causar este error.

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.

Obtendríamos el mismo error con IN . Si debe devolver varias columnas en su subconsulta, use EXISTS .