sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server ALL Operatör förklaras

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.


  1. Automatisk dataversionering i MariaDB Server 10.3

  2. Hur man uppdaterar Array i PostgreSQL

  3. Hur kan jag läsa data från en krypterad DB med SQLiteAssetHelper?

  4. FÖR XML PATH(''):Escapende specialtecken