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 .