In SQL Server kunt u de SOME
logische operator om een scalaire waarde te vergelijken met een reeks waarden met één kolom die door een subquery worden geretourneerd.
Het kan worden gebruikt met subquery's die een resultatenset van één kolom hebben.
De SOME
operator is het equivalent van de ANY
logische operator.
Voorbeeld
Stel je voor dat we twee tabellen hebben; Cats
en Dogs
Katten
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Honden
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
Laten we nu een subquery uitvoeren met de ANY
telefoniste.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);
Resultaat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
vs ANY
Zoals vermeld, SOME
is het equivalent van ANY
.
Dus we kunnen onze zoekopdracht wijzigen om ANY
. te gebruiken in plaats van SOME
.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);
Resultaat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
vs IN
We zouden hetzelfde resultaat krijgen als we de query zouden veranderen zodat deze de IN
. gebruikt operator in plaats van SOME
.
Hier gebruikt het de IN
telefoniste.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Resultaat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
vs EXISTS
We zouden hetzelfde kunnen doen met de EXISTS
telefoniste.
Hier gebruikt het de EXISTS
telefoniste.
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Resultaat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Fout 116?
Als je fout 116 krijgt bij het gebruik van SOME
, komt dit waarschijnlijk omdat u meerdere kolommen in uw subquery selecteert. De SOME
operator kan alleen worden gebruikt met subquery's die een resultatenset van één kolom hebben.
Hier is een voorbeeld van hoe we deze fout kunnen veroorzaken.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT * FROM Dogs);
Resultaat:
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.
We zouden dezelfde fout krijgen met IN
. Als u meerdere kolommen in uw subquery moet retourneren, gebruikt u EXISTS
.