Przejdź do zawartości

Operator Union

Z Wikipedii, wolnej encyklopedii

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 | edytuj kod]

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

[edytuj | edytuj kod]