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.