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.