I SQL Server kan du använda ANY
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.
ANY
operatorn är motsvarigheten till SOME
logisk operator.
Exempel
Antag att vi har två tabeller; 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 = ANY (SELECT DogName FROM Dogs);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
kontra SOME
Vi skulle få samma resultat om vi skulle ändra frågan så att den använder SOME
operator istället för ANY
.
Här använder den SOME
operator istället för ANY
.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = SOME (SELECT DogName FROM Dogs);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
kontra IN
Vi kan också använda IN
för att få samma resultat.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName IN (SELECT DogName FROM Dogs);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
ANY
kontra EXISTS
Vi skulle kunna göra samma sak 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 | +---------+-----------+
Fel 116?
Om du får fel 116 när du använder ANY
, beror det förmodligen på att du väljer flera kolumner i din underfråga. ANY
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 = 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 denna mening är ANY
operatorn är mer lik IN
operatorn än den är till EXISTS
operatör. Vi skulle få samma fel med IN
.
Om du måste returnera flera kolumner i din underfråga, använd EXISTS
.