I SQL Server kan du använda SOME
logisk operator för att jämföra ett skalärt värde med en uppsättning värden i en kolumn som returneras av en underfråga.
Den kan användas med underfrågor som har en resultatuppsättning av en kolumn.
SOME
operatorn är motsvarigheten till ANY
logisk operator.
Exempel
Föreställ dig att vi har två bord; Cats
och Dogs
Katter
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Hundar
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
Låt oss nu köra en underfråga med ANY
operatör.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
kontra ANY
Som nämnts, SOME
är motsvarigheten till ANY
.
Så vi kunde ändra vår fråga till att använda ANY
istället för SOME
.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ANY (SELECT DogName FROM Dogs);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
kontra IN
Vi skulle få samma resultat om vi skulle ändra frågan så att den använder IN
operator istället för SOME
.
Här använder den IN
operatör.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
SOME
kontra EXISTS
Vi skulle kunna göra samma sak med EXISTS
operatör.
Här använder 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 | +---------+-----------+
Fel 116?
Om du får fel 116 när du använder SOME
, beror det förmodligen på att du väljer flera kolumner i din underfråga. SOME
operatorn kan endast användas med underfrågor som har en resultatuppsättning av en kolumn.
Här är ett exempel på hur vi kan orsaka detta fel.
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 skulle få samma fel med IN
. Om du måste returnera flera kolumner i din underfråga, använd EXISTS
.