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

SQL Server SOME-Operator erklärt

In SQL Server können Sie den SOME 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.

Die SOME Operator ist das Äquivalent von ANY logischer Operator.

Beispiel

Stellen Sie sich vor, 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 = SOME (SELECT DogName FROM Dogs);

Ergebnis:

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

SOME vs ANY

Wie bereits erwähnt, SOME ist das Äquivalent von ANY .

Wir könnten also unsere Abfrage so ändern, dass sie ANY verwendet statt SOME .

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

Ergebnis:

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

SOME vs IN

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

Hier wird der IN verwendet Betreiber.

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

Ergebnis:

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

SOME vs EXISTS

Wir könnten dasselbe mit EXISTS machen Betreiber.

Hier wird der EXISTS verwendet 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 SOME verwenden , liegt es wahrscheinlich daran, dass Sie mehrere Spalten in Ihrer Unterabfrage auswählen. Die SOME 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 = SOME (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.

Wir würden denselben Fehler mit IN erhalten . Wenn Sie mehrere Spalten in Ihrer Unterabfrage zurückgeben müssen, verwenden Sie EXISTS .