Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server ANY-Operator erklärt

In SQL Server können Sie den ANY verwenden logischer Operator zum Vergleichen eines Skalarwerts mit einem einspaltigen Wertesatz, der von einer Unterabfrage zurückgegeben wird.

Es kann mit Unterabfragen verwendet werden, die eine Ergebnismenge von einer Spalte haben.

Der ANY Operator ist das Äquivalent zu SOME logischer Operator.

Beispiel

Angenommen, wir haben zwei Tabellen; Cats und Dogs

Katzen

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

Hunde

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

Lassen Sie uns nun eine Unterabfrage mit ANY ausführen Betreiber.

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

Ergebnis:

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

ANY vs SOME

Wir würden dasselbe Ergebnis erhalten, wenn wir die Abfrage so ändern würden, dass sie SOME verwendet Operator anstelle von ANY .

Hier wird der SOME verwendet Operator anstelle von ANY .

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

Ergebnis:

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

ANY vs IN

Wir könnten auch den IN verwenden Operator, um dasselbe Ergebnis zu erhalten.

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

Ergebnis:

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

ANY vs EXISTS

Wir könnten dasselbe mit EXISTS machen Betreiber.

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

Ergebnis:

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

Fehler 116?

Wenn Sie Fehler 116 erhalten, wenn Sie ANY verwenden , liegt es wahrscheinlich daran, dass Sie mehrere Spalten in Ihrer Unterabfrage auswählen. Der ANY Der Operator kann nur mit Unterabfragen verwendet werden, die eine Ergebnismenge von einer Spalte haben.

Hier ist ein Beispiel dafür, wie wir diesen Fehler verursachen können.

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

Ergebnis:

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 diesem Sinne der ANY Der Operator ist dem IN ähnlicher Operator als für EXISTS Operator. Wir würden denselben Fehler mit IN erhalten .

Wenn Sie mehrere Spalten in Ihrer Unterabfrage zurückgeben müssen, verwenden Sie EXISTS .