sql >> Databáze >  >> RDS >> Sqlserver

SQL Server ALL operátor vysvětlen

V SQL Server, ALL Operátor lze použít s poddotazem k porovnání skalární hodnoty s jednosloupcovou sadou hodnot vrácených poddotazem.

Je také pravda, že SELECT klauzule a UNION oba operátory přijímají ALL argument, ačkoli toto použití má jiný účel (umožňuje duplikáty v sadě výsledků).

Níže jsou uvedeny příklady použití ALL operátor s poddotazem.

Příklad

Předpokládejme, že máme dvě tabulky; Cats a Dogs

Cats

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 2       | Fluffy    |
| 3       | Scratch   |
+---------+-----------+

Dogs

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Fetch     |
| 2       | Fluffy    |
| 3       | Wag       |
+---------+-----------+

Nyní spusťte dílčí dotaz pomocí ALL operátor.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ALL (SELECT DogName FROM Dogs);

Výsledek:

(0 rows affected)

V tomto případě nebyly vráceny žádné řádky. Je to proto, že ALL vyžaduje, aby se skalární výraz porovnal pozitivně s každým hodnotu, která je vrácena poddotazem.

V tomto případě byl dílčí dotaz tak široký, že všechny řádky z Dogs stůl byl vrácen. To by vyžadovalo, aby každý pes měl alespoň jednu odpovídající kočku se stejným jménem.

Změňme mírně poddotaz.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ALL (
    SELECT DogName FROM Dogs 
    WHERE DogId = 2
    );

Výsledek:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 2       | Fluffy    |
+---------+-----------+

V tomto případě dostanu kladný výsledek, protože všechny řádky vrácené poddotazem měly odpovídající řádek v Cats tabulka (i když pouze jeden řádek).

Vraťte opak

Můžeme použít jakýkoli operátor porovnání s ALL . Takže bychom mohli upravit předchozí příklady tak, aby vrátily opačný výsledek, jednoduše změnou operátoru rovná se (=) na operátor nerovná se (buď <> nebo nestandardní ISO != ).

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName <> ALL (SELECT DogName FROM Dogs);

Výsledek:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 3       | Scratch   |
+---------+-----------+

Takže namísto vracení všech řádků, které mají v poddotazu odpovídající řádek, vracíme všechny řádky, které nemají mít odpovídající řádek.

A totéž můžeme udělat s dalším příkladem.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName <> ALL (
    SELECT DogName FROM Dogs 
    WHERE DogId = 2
    );

Výsledek:

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Meow      |
| 3       | Scratch   |
+---------+-----------+

Chyba 116?

Pokud se při použití ALL zobrazí chyba 116 , je to pravděpodobně proto, že ve svém poddotazu vybíráte více sloupců. ALL Operátor lze použít pouze s poddotazy, které mají sadu výsledků s jedním sloupcem.

Zde je příklad toho, jak můžeme tuto chybu způsobit.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ALL (SELECT DogId, DogName FROM Dogs);

Jednoduše jsem přidal sloupec do poddotazu.

Je to běžná chyba při použití zástupného operátoru k výběru všech sloupců v poddotazu.

SELECT 
    CatId,
    CatName
FROM Cats c 
WHERE c.CatName = ALL (SELECT * FROM Dogs);

V každém případě je výsledek stejný:

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. Vyhodnocování, když je vyhodnocen výraz v dotazu

  2. Jaká je ekvivalentní syntaxe PostgreSQL se syntaxí Oracle CONNECT BY ... START WITH?

  3. Dílčí dotazy vs spojení

  4. Aktualizujte hodnotu primárního klíče pomocí entity framework