Možná znáte ALL
možnost na serveru SQL Server. Možná jste jej používali spolu s UNION
operátor zahrnout všechny duplikáty, které by mohly být vráceny do sady výsledků.
Ale věděli jste, že ALL
lze také použít ve dvou jiných kontextech?
ALL
lze použít v následujících třech kontextech:
- Jako argument pro
SELECT
doložka. - Jako argument pro
UNION
doložka. - Jako logický operátor při porovnávání skalární hodnoty se sadou hodnot s jedním sloupcem.
Příklady každého z těchto kontextů následují.
ALL
v SELECT
Ustanovení
Při použití s SELECT
klauzule, ALL
určuje, že v sadě výsledků budou vráceny duplicitní hodnoty.
Pravděpodobně to již implicitně používáte, aniž byste to věděli.
V T-SQL, syntaxe pro SELECT
klauzule zní takto:
SELECT [ ALL | DISTINCT ]
[ TOP ( expression ) [ PERCENT ] [ WITH TIES ] ]
<select_list>
<select_list> ::=
{
*
| { table_name | view_name | table_alias }.*
| {
[ { table_name | view_name | table_alias }. ]
{ column_name | $IDENTITY | $ROWGUID }
| udt_column_name [ { . | :: } { { property_name | field_name }
| method_name ( argument [ ,...n] ) } ]
| expression
[ [ AS ] column_alias ]
}
| column_alias = expression
} [ ,...n ]
Část, která jde [ ALL | DISTINCT ]
znamená, že máte na výběr mezi ALL
a DISTINCT
.
Hranaté závorky znamenají, že tato část je volitelná.
ALL
určuje, že v sadě výsledků se mohou objevit duplicitní řádky.DISTINCT
určuje, že v sadě výsledků se mohou objevit pouze jedinečné řádky.
ALL
je výchozí hodnota, takže pokud nezadáte ALL
nebo DISTINCT
, ALL
se používá.
Příklad
Následující dva příkazy jsou tedy ekvivalentní:
SELECT DogName
FROM Dogs;
SELECT ALL DogName
FROM Dogs;
Příklad výsledku:
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | +-----------+ (4 rows affected) +-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | +-----------+ (4 rows affected)
Oba výsledky ukazují, že existují dva psi s názvem „Aport“.
Pokud prohodíme ALL
argument pro DISTINCT
, bude vrácen pouze jeden řádek pro „Načíst“. Důvodem je DISTINCT
odstraní všechny duplicitní hodnoty ze sady výsledků.
SELECT DISTINCT DogName
FROM Dogs;
Příklad výsledku:
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | +-----------+ (3 rows affected)
ALL
v UNION
Ustanovení
ALL
dělá to samé při použití s UNION
doložka. Určuje, že v sadě výsledků jsou vráceny duplicitní hodnoty.
Ale samozřejmě UNION
je jiná klauzule než SELECT
, takže kontext je mírně odlišný.
UNION
klauzule zřetězí výsledky dvou dotazů do jediné sady výsledků. Můžete jej použít s nebo bez ALL
argument:
UNION ALL
– Zahrnuje duplikáty.UNION
– Nezahrnuje duplikáty.
Příklad
Zde je příklad použití UNION ALL
zkombinovat dva dotazy.
Přidejme tabulku nazvanou Cats
. Máme tedy dvě tabulky:Dogs
a Cats
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Nyní vybereme jméno psa/kočky z každé tabulky a použijeme UNION ALL
spojit výsledky z obou tabulek.
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats;
Výsledek:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | | Meow | | Fluffy | | Scratch | +-----------+ (7 rows affected)
V tomto případě se vrátí sedm řádků. Vidíme, že „Načíst“ je vráceno dvakrát. Je to proto, že existují dva psi jménem Fetch.
Je tu také kočka a pes se stejným jménem:Fluffy. (Víme, že ta druhá je kočka, protože v předchozím příkladu byl pouze jeden pes jménem Fluffy).
Uvidíme, co se stane, když odstraním ALL
argument.
SELECT DogName AS PetName
FROM Dogs
UNION
SELECT CatName
FROM Cats;
Výsledek:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Meow | | Scratch | | Wag | +-----------+ (5 rows affected)
Tentokrát je vráceno pouze pět řádků. Oba duplikáty jsou odstraněny.
Všimněte si, že se to liší od použití DISTINCT
každému jednotlivému SELECT
prohlášení. Pokud bychom to udělali, Fluffy by byl vrácen dvakrát, protože ALL
platí pouze pro SELECT
prohlášení, proti kterému je aplikováno (nikoli na zřetězené výsledky).
Zde je příklad pro ilustraci toho, co mám na mysli.
SELECT DISTINCT DogName AS PetName
FROM Dogs
UNION ALL
SELECT DISTINCT CatName
FROM Cats;
Výsledek:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fluffy | | Meow | | Scratch | +-----------+ (6 rows affected)
ALL
Operátor
ALL
Operátor lze použít s poddotazem k porovnání skalární hodnoty s jednosloupcovou sadou hodnot vrácených poddotazem.
Příklad
Pro osvěžení zde jsou naše dvě tabulky:
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
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 | +---------+-----------+
Tentokrát dostanu kladný výsledek, protože všechny řádky vrácené poddotazem měly odpovídající řádek v Cats
tabulka (v tomto případě pouze jeden řádek).