Operator Union

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj

Operator UNIONoperator w języku SQL łączący rezultaty dwóch zapytań w jedną tabelę (bądź inną postać wyniku) zawierającą wszystkie pasujące do nich wiersze. Oba zapytania biorące udział w złączeniu muszą generować jednakową liczbę kolumn o odpowiednio kompatybilnych typach danych. Zdublowane rekordy są automatycznie usuwane, z wyjątkiem sytuacji, w której zostało użyte UNION ALL .

Operator UNION może być użyteczny w bazodanowych aplikacjach magazynowych, w których tabele nie są perfekcyjnie unormowane. Prostym przykładem niech będzie baza danych zawierająca tabele sales2005 oraz sales2006 , które posiadają identyczną strukturę ale są rozseparowane ze względu na reprezentowane wyniki. Zapytanie UNION powinno połączyć wyniki z obydwu tabel.

UNION nie gwarantuje uporządkowania wierszy. Wiersze z drugiego operandu mogą pojawiać się przed, po, lub pomieszane z wierszami z pierwszego operandu. W razie potrzeby specjalnego uporządkowania, należy użyć ORDER BY.

UNION ALL może być zdecydowanie szybsze niż zwykłe UNION. UNION ALL jest techniką stosowaną do zarządzania serwisowania i tworzenia w środowiskach magazynowych o dużej ilości danych. Chroni ona programistów przed koniecznością tworzenia czasochłonnych projektów bazodanowych. Bazy danych mogą mieć bardzo niejednorodny tzw. bieżący przedział czasowy (np. porcja miesięczna lub dzienna), a starsze dane bywają rzadko uaktualniane. Używające różnych nośników pamięci, obszarów tablicowych, tabel, i definicji indeksów, ustawienia mogą być zestrojone w celu uzyskania specyficznych wyników dla różnych poziomów zmienności i częstotliwości uaktualnień.

W bazach danych MS SQL oraz IBM DB2 operator UNION ALL jest elementem tworzącym zapytania rekurencyjne[1]

Przykłady zastosowań[edytuj]

Dane są następujące dwie tabele:

sales2005
person amount
Joe 1000
Alex 2000
Bob 5000
sales2006
person amount
Joe 2000
Alex 2000
Zach 35000

Użycie następującej sekwencji:

SELECT * FROM sales2005
UNION
SELECT * FROM sales2006;

przyniesie następujący zestaw rezultatów, jednak kolejność wierszy może być różna ponieważ nie dołączono klauzuli ORDER BY:

person amount
Joe 1000
Alex 2000
Bob 5000
Joe 2000
Zach 35000

Warto zauważyć, że są dwa wiersze z Joe ponieważ różnią się one w kolumnie amount. Jest tylko jeden wiersz z Alexem bo w obu tabelach wiersze te nie różnią się.

UNION ALL daje inne rezultaty, ponieważ nie eliminuje duplikatów. Uruchamiając sekwencję:

SELECT * FROM sales2005
UNION ALL
SELECT * FROM sales2006;

można otrzymać następujące rezultaty, ponownie zawierające pomieszane dane z powodu braku rozszerzenia ORDER BY:

person amount
Joe 1000
Joe 2000
Alex 2000
Alex 2000
Bob 5000
Zach 35000

Przypisy