Być może znasz ALL opcja w SQL Server. Być może używałeś go razem z UNION operatora, aby uwzględnić wszelkie duplikaty, które mogą zostać zwrócone w zestawie wyników.
Ale czy wiesz, że ALL może być również używany w dwóch innych kontekstach?
ALL może być używany w następujących trzech kontekstach:
- Jako argument do
SELECTklauzula. - Jako argument do
UNIONklauzula. - Jako operator logiczny przy porównywaniu wartości skalarnej z jednokolumnowym zestawem wartości.
Poniżej znajdują się przykłady każdego z tych kontekstów.
ALL w SELECT Klauzula
W przypadku użycia z SELECT klauzula, ALL określa, że zduplikowane wartości są zwracane w zestawie wyników.
Prawdopodobnie już używasz tego niejawnie, nawet o tym nie wiedząc.
W T-SQL składnia SELECT klauzula brzmi tak:
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 ]
Część, która idzie [ ALL | DISTINCT ] oznacza, że masz wybór między ALL i DISTINCT .
Nawiasy kwadratowe oznaczają, że ta część jest opcjonalna.
ALLokreśla, że w zestawie wyników mogą pojawić się zduplikowane wiersze.DISTINCTokreśla, że w zestawie wyników mogą pojawiać się tylko unikatowe wiersze.
ALL jest wartością domyślną, więc jeśli nie określisz ALL lub DISTINCT , ALL jest używany.
Przykład
Zatem następujące dwa stwierdzenia są równoważne:
SELECT DogName
FROM Dogs;
SELECT ALL DogName
FROM Dogs; Przykładowy wynik:
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | +-----------+ (4 rows affected) +-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | +-----------+ (4 rows affected)
Oba wyniki pokazują, że istnieją dwa psy o nazwie „Fetch”.
Jeśli zamienimy ALL argument dla DISTINCT , tylko jeden wiersz zostanie zwrócony dla „Pobierz”. Dzieje się tak, ponieważ DISTINCT usuwa wszystkie zduplikowane wartości z zestawu wyników.
SELECT DISTINCT DogName
FROM Dogs; Przykładowy wynik:
+-----------+ | DogName | |-----------| | Fetch | | Fluffy | | Wag | +-----------+ (3 rows affected)
ALL w UNION Klauzula
ALL robi to samo, gdy jest używany z UNION klauzula. Określa, że zduplikowane wartości są zwracane w zestawie wyników.
Ale oczywiście UNION jest inną klauzulą niż SELECT , więc kontekst jest nieco inny.
UNION klauzula łączy wyniki dwóch zapytań w jeden zestaw wyników. Możesz go używać z lub bez ALL argument:
UNION ALL– Zawiera duplikaty.UNION– Wyklucza duplikaty.
Przykład
Oto przykład użycia UNION ALL połączyć dwa zapytania.
Dodajmy tabelę o nazwie Cats . Mamy więc dwie tabele:Dogs i Cats
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Teraz wybierzmy imię psa/kota z każdej tabeli i użyjmy UNION ALL połączyć wyniki z obu tabel.
SELECT DogName AS PetName
FROM Dogs
UNION ALL
SELECT CatName
FROM Cats; Wynik:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fetch | | Meow | | Fluffy | | Scratch | +-----------+ (7 rows affected)
W takim przypadku zwracanych jest siedem wierszy. Widzimy, że „Fetch” jest zwracane dwukrotnie. Dzieje się tak, ponieważ istnieją dwa psy o imieniu Fetch.
Jest też kot i pies o tym samym imieniu:Fluffy. (Wiemy, że drugi to kot, ponieważ w poprzednim przykładzie był tylko jeden pies o imieniu Fluffy).
Zobaczmy, co się stanie, gdy usunę ALL argument.
SELECT DogName AS PetName
FROM Dogs
UNION
SELECT CatName
FROM Cats; Wynik:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Meow | | Scratch | | Wag | +-----------+ (5 rows affected)
Tym razem zwracanych jest tylko pięć wierszy. Oba duplikaty są usuwane.
Zauważ, że różni się to od stosowania DISTINCT do każdego z osobna SELECT oświadczenie. Gdybyśmy to zrobili, Fluffy zostałby zwrócony dwa razy, ponieważ ALL dotyczy tylko SELECT oświadczenie, że jest stosowany przeciwko (nie do połączonych wyników).
Oto przykład ilustrujący, o co mi chodzi.
SELECT DISTINCT DogName AS PetName
FROM Dogs
UNION ALL
SELECT DISTINCT CatName
FROM Cats; Wynik:
+-----------+ | PetName | |-----------| | Fetch | | Fluffy | | Wag | | Fluffy | | Meow | | Scratch | +-----------+ (6 rows affected)
ALL Operator
ALL Operator może być używany z podzapytaniem do porównania wartości skalarnej z jednokolumnowym zestawem wartości zwracanych przez podzapytanie.
Przykład
Dla przypomnienia, oto nasze dwie tabele:
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Fetch | | 2 | Fluffy | | 3 | Wag | | 1002 | Fetch | +---------+-----------+
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Meow | | 2 | Fluffy | | 3 | Scratch | +---------+-----------+
Teraz uruchommy podzapytanie za pomocą ALL operatora.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (SELECT DogName FROM Dogs); Wynik:
(0 rows affected)
W tym przypadku nie zostały zwrócone żadne wiersze. Dzieje się tak, ponieważ ALL wymaga wyrażenia skalarnego do pozytywnego porównania z każdym wartość zwracana przez podzapytanie.
W tym przypadku podzapytanie było tak szerokie, że wszystkie wiersze z Dogs tabela została zwrócona. Wymagałoby to, aby każdy pies miał co najmniej jednego odpowiadającego kota o tym samym imieniu.
Zmieńmy nieco podzapytanie.
SELECT
CatId,
CatName
FROM Cats c
WHERE c.CatName = ALL (
SELECT DogName FROM Dogs
WHERE DogId = 2
); Wynik:
+---------+-----------+ | CatId | CatName | |---------+-----------| | 2 | Fluffy | +---------+-----------+
Tym razem otrzymuję wynik pozytywny, ponieważ wszystkie wiersze zwrócone przez podzapytanie miały odpowiedni wiersz w Cats tabela (w tym przypadku tylko jeden wiersz).