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
.