In SQL Server is de ALL
operator kan worden gebruikt met een subquery om een scalaire waarde te vergelijken met een reeks waarden met één kolom die door de subquery worden geretourneerd.
Het is ook waar dat de SELECT
clausule en UNION
operator accepteert beide een ALL
argument, hoewel dit gebruik een ander doel heeft (laat duplicaten toe in de resultatenset).
Hieronder staan voorbeelden van het gebruik van de ALL
operator met een subquery.
Voorbeeld
Stel dat we twee tabellen hebben; Cats
en Dogs
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | +---------+-----------+
Laten we nu een subquery uitvoeren met de ALL
telefoniste.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogName FROM Dogs);
Resultaat:
(0 rows affected)
In dit geval zijn er geen rijen geretourneerd. Dit komt omdat ALL
vereist dat de scalaire expressie positief wordt vergeleken met elke waarde die wordt geretourneerd door de subquery.
In dit geval was de subquery zo breed dat alle rijen van de Dogs
tafel teruggestuurd. Dit zou vereisen dat elke hond ten minste één corresponderende kat met dezelfde naam had.
Laten we de subquery iets veranderen.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
Resultaat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
In dit geval krijg ik een positief resultaat, omdat alle rijen die door de subquery zijn geretourneerd een overeenkomstige rij hadden in de Cats
tabel (hoewel slechts één rij).
Retourneer het tegenovergestelde
We kunnen elke vergelijkingsoperator gebruiken met ALL
. We zouden de vorige voorbeelden dus kunnen wijzigen om het tegenovergestelde resultaat te retourneren, simpelweg door de operator is gelijk aan (=) te veranderen in een operator die niet gelijk is aan (ofwel <>
of de niet-ISO-standaard !=
).
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName <> ALL (SELECT DogName FROM Dogs);
Resultaat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 3 | Scratch | +---------+-----------+
Dus in plaats van alle rijen te retourneren die een corresponderende rij in de subquery hebben, retourneren we alle rijen die niet een overeenkomstige rij hebben.
En we kunnen hetzelfde doen met het andere voorbeeld.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName <> ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
);
Resultaat:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 3 | Scratch | +---------+-----------+
Fout 116?
Als u fout 116 krijgt bij het gebruik van ALL
, komt dit waarschijnlijk omdat u meerdere kolommen in uw subquery selecteert. De ALL
operator kan alleen worden gebruikt met subquery's die een resultatenset van één kolom hebben.
Hier is een voorbeeld van hoe we deze fout kunnen veroorzaken.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogId, DogName FROM Dogs);
Ik heb gewoon een kolom aan de subquery toegevoegd.
Het is een veelvoorkomende fout bij het gebruik van de jokertekenoperator om alle kolommen in de subquery te selecteren.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT * FROM Dogs);
Het resultaat is hoe dan ook hetzelfde:
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.