I SQL Server, ALL
operatorn kan användas med en underfråga för att jämföra ett skalärt värde med en uppsättning värden i en kolumn som returneras av underfrågan.
Det är också sant att SELECT
sats och UNION
operatören accepterar båda en ALL
argument, även om denna användning har ett annat syfte (tillåter dubbletter i resultatuppsättningen).
Nedan finns exempel på hur du använder ALL
operatör med en underfråga.
Exempel
Antag att vi har två tabeller; Cats
och Dogs
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
Låt oss nu köra en underfråga med ALL
operatör.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogName FROM Dogs);
Resultat:
(0 rows affected)
I det här fallet returnerades inga rader. Detta beror på att ALL
kräver att det skalära uttrycket jämförs positivt med alla värde som returneras av underfrågan.
I det här fallet var underfrågan så bred att alla rader från Dogs
bordet returnerades. Detta skulle kräva att varje hund hade minst en motsvarande katt med samma namn.
Låt oss ändra underfrågan något.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
I det här fallet får jag ett positivt resultat, eftersom alla rader som returneras av underfrågan hade en motsvarande rad i Cats
tabell (om än bara en rad).
Återställ motsatsen
Vi kan använda vilken jämförelseoperator som helst med ALL
. Så vi skulle kunna modifiera de tidigare exemplen för att returnera det motsatta resultatet, helt enkelt genom att ändra operatorn equals (=) till en operator som inte är lika med (antingen <>
eller icke ISO-standarden !=
).
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName <> ALL (SELECT DogName FROM Dogs);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 3 | Scratch | +---------+-----------+
Så istället för att returnera alla rader som har en motsvarande rad i underfrågan, returnerar vi alla rader som inte har en motsvarande rad.
Och vi kan göra samma sak med det andra exemplet.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName <> ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
Resultat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 3 | Scratch | +---------+-----------+
Fel 116?
Om du får fel 116 när du använder ALL
, beror det förmodligen på att du väljer flera kolumner i din underfråga. ALL
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 = ALL (SELECT DogId, DogName FROM Dogs);
Jag lade helt enkelt till en kolumn i underfrågan.
Det är ett vanligt fel när jokerteckenoperatorn används för att välja alla kolumner i underfrågan.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT * FROM Dogs);
Hur som helst, resultatet är detsamma:
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.