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 .