sql >> Database >  >> RDS >> Sqlserver

SQL Server ALL-operator uitgelegd

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.


  1. Werkmap gebruiken voor bronbeheerdatabase

  2. Genereer online PL/SQL-procedure om gegevens in Oracle-tabel te importeren

  3. E-mailqueryresultaten als HTML-tabel in SQL Server (T-SQL)

  4. SQL Server Invoegen indien niet bestaat