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

Spiegazione di ALCUNI operatori di SQL Server

In SQL Server, puoi utilizzare SOME 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 SOME operatore è l'equivalente di ANY operatore logico.

Esempio

Immagina di avere due tavoli; 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 = SOME (SELECT DogName FROM Dogs);

Risultato:

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

SOME rispetto a ANY

Come accennato, SOME è l'equivalente di ANY .

Quindi potremmo modificare la nostra query per utilizzare ANY invece di SOME .

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

Risultato:

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

SOME rispetto a IN

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

Qui sta usando il IN operatore.

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

Risultato:

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

SOME vs EXISTS

Potremmo fare la stessa cosa con EXISTS operatore.

Qui sta usando il 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 SOME , è probabilmente perché stai selezionando più colonne nella tua sottoquery. Il SOME 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 = SOME (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.

Otterremmo lo stesso errore con IN . Se devi restituire più colonne nella tua sottoquery, usa EXISTS .