I SQL Server kan du bruge ANY
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.
ANY
operator svarer til SOME
logisk operator.
Eksempel
Antag, at vi har to tabeller; 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 = ANY (SELECT DogName FROM Dogs);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
vs SOME
Vi ville få det samme resultat, hvis vi ændrede forespørgslen, så den bruger SOME
operator i stedet for ANY
.
Her bruger den SOME
operator i stedet for ANY
.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
vs IN
Vi kunne også bruge IN
operatør for at få det samme resultat.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
vs EXISTS
Vi kunne gøre det samme med 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 ANY
, er det sandsynligvis fordi du vælger flere kolonner i din underforespørgsel. ANY
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 = ANY (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.
I denne forstand er ANY
operatoren minder mere om IN
operatør end den er til EXISTS
operatør. Vi ville få den samme fejl med IN
.
Hvis du skal returnere flere kolonner i din underforespørgsel, skal du bruge EXISTS
.