I SQL Server kan du bruge SOME
logisk operator til at sammenligne en skalarværdi med et enkelt-kolonne sæt værdier, der returneres af en underforespørgsel.
Det kan bruges med underforespørgsler, der har et resultatsæt på én kolonne.
SOME
operatoren svarer til ANY
logisk operator.
Eksempel
Forestil dig, at vi har to borde; Cats
og Dogs
Katte
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Hunde
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
Lad os nu køre en underforespørgsel ved hjælp af ANY
operatør.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
vs ANY
Som nævnt, SOME
svarer til ANY
.
Så vi kunne ændre vores forespørgsel til at bruge ANY
i stedet for SOME
.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
vs IN
Vi ville få det samme resultat, hvis vi ændrede forespørgslen, så den bruger IN
operator i stedet for SOME
.
Her bruger den IN
operatør.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
vs EXISTS
Vi kunne gøre det samme med EXISTS
operatør.
Her bruger den EXISTS
operatør.
SELECT
CatId,
CatName
FROM Cats c
WHERE EXISTS (SELECT DogId, DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Fejl 116?
Hvis du får fejl 116, når du bruger SOME
, er det sandsynligvis fordi du vælger flere kolonner i din underforespørgsel. SOME
operator kan kun bruges med underforespørgsler, der har et resultatsæt på én kolonne.
Her er et eksempel på, hvordan vi kan forårsage denne fejl.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT * FROM Dogs);
Resultat:
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.
Vi ville få den samme fejl med IN
. Hvis du skal returnere flere kolonner i din underforespørgsel, skal du bruge EXISTS
.