Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Spiegazione di QUALSIASI operatore di SQL Server

In SQL Server puoi utilizzare ANY operatore logico per confrontare un valore scalare con un insieme di valori a colonna singola restituito da una sottoquery.

Può essere utilizzato con sottoquery che hanno un set di risultati di una colonna.

Il ANY operatore è l'equivalente di SOME operatore logico.

Esempio

Supponiamo di avere due tabelle; Cats e Dogs

Gatti

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

Cani

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

Ora eseguiamo una sottoquery utilizzando ANY operatore.

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

Risultato:

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

ANY vs SOME

Otterremmo lo stesso risultato se cambiassimo la query in modo che utilizzi SOME operatore invece di ANY .

Qui sta usando SOME operatore invece di ANY .

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

Risultato:

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

ANY rispetto a IN

Potremmo anche usare IN operatore per ottenere lo stesso risultato.

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

Risultato:

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

ANY vs EXISTS

Potremmo fare la stessa cosa con EXISTS operatore.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);

Risultato:

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

Errore 116?

Se ricevi l'errore 116 quando usi ANY , probabilmente è perché stai selezionando più colonne nella tua sottoquery. Il ANY l'operatore può essere utilizzato solo con sottoquery che hanno un set di risultati di una colonna.

Ecco un esempio di come possiamo causare questo errore.

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

Risultato:

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.

In questo senso, il ANY l'operatore è più simile a IN operatore rispetto a EXISTS operatore. Otterremmo lo stesso errore con IN .

Se devi restituire più colonne nella tua sottoquery, usa EXISTS .