SQL
UNION / UNION ALL
Szukaj…
Wprowadzenie
Składnia
- SELECT column_1 [, column_2] FROM table_1 [, table_2] [GDZIE warunek]
UNIA | UNION ALL
SELECT column_1 [, column_2] FROM table_1 [, table_2] [GDZIE warunek]
Uwagi
Klauzule UNION
i UNION ALL
łączą zestaw wyników dwóch lub więcej identycznie ustrukturyzowanych instrukcji SELECT w jeden wynik / tabelę.
Zarówno liczba kolumn, jak i typy kolumn dla każdego zapytania muszą być zgodne, aby funkcja UNION
/ UNION ALL
działała.
Różnica między zapytaniem UNION
i UNION ALL
polega na tym, że klauzula UNION
usunie wszelkie zduplikowane wiersze w wyniku, w przypadku których UNION ALL
nie.
To wyraźne usunięcie rekordów może znacznie spowolnić zapytania, nawet jeśli nie ma oddzielnych wierszy do usunięcia z tego powodu, jeśli wiesz, że nie będzie żadnych duplikatów (lub nie obchodzi), zawsze domyślnie UNION ALL
dla bardziej zoptymalizowanego zapytania.
Podstawowe zapytanie UNION ALL
CREATE TABLE HR_EMPLOYEES
(
PersonID int,
LastName VARCHAR(30),
FirstName VARCHAR(30),
Position VARCHAR(30)
);
CREATE TABLE FINANCE_EMPLOYEES
(
PersonID INT,
LastName VARCHAR(30),
FirstName VARCHAR(30),
Position VARCHAR(30)
);
Powiedzmy, że chcemy wydobyć nazwiska wszystkich managers
z naszych działów.
Korzystając z UNION
, możemy pozyskać wszystkich pracowników zarówno z działów HR, jak i finansów, którzy zajmują position
manager
SELECT
FirstName, LastName
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
Instrukcja UNION
usuwa zduplikowane wiersze z wyników zapytania. Ponieważ możliwe jest posiadanie osób o tej samej nazwie i stanowisku w obu działach, używamy UNION ALL
, aby nie usuwać duplikatów.
Jeśli chcesz użyć aliasu dla każdej kolumny wyjściowej, możesz po prostu umieścić je w pierwszej instrukcji select w następujący sposób:
SELECT
FirstName as 'First Name', LastName as 'Last Name'
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
Proste wyjaśnienie i przykład
W prostych słowach:
-
UNION
dołącza 2 zestawy wyników, jednocześnie usuwając duplikaty z zestawu wyników -
UNION ALL
dołącza do 2 zestawów wyników bez próby usunięcia duplikatów
Jednym błędem wielu osób jest użycie
UNION
gdy nie trzeba usuwać duplikatów. Dodatkowy koszt wydajności w porównaniu z dużymi zestawami wyników może być bardzo znaczący.
Kiedy możesz potrzebować UNION
Załóżmy, że musisz przefiltrować tabelę według 2 różnych atrybutów i utworzyłeś osobne nieklastrowane indeksy dla każdej kolumny. UNION
umożliwia wykorzystanie obu indeksów, jednocześnie zapobiegając duplikacjom.
SELECT C1, C2, C3 FROM Table1 WHERE C1 = @Param1
UNION
SELECT C1, C2, C3 FROM Table1 WHERE C2 = @Param2
Upraszcza to dostrajanie wydajności, ponieważ do optymalnego wykonywania tych zapytań potrzebne są tylko proste indeksy. Możesz nawet być w stanie sobie poradzić z nieco mniejszą liczbą indeksów nieklastrowych, poprawiając także ogólną wydajność zapisu względem tabeli źródłowej.
Kiedy możesz potrzebować UNION ALL
Załóżmy, że nadal musisz filtrować tabelę według 2 atrybutów, ale nie musisz filtrować duplikatów rekordów (albo dlatego, że to nie ma znaczenia, albo twoje dane nie utworzą żadnych duplikatów podczas unii z powodu projektu modelu danych).
SELECT C1 FROM Table1
UNION ALL
SELECT C1 FROM Table2
Jest to szczególnie przydatne podczas tworzenia widoków, które łączą dane, które mają być fizycznie podzielone na wiele tabel (być może ze względu na wydajność, ale nadal chce zrolować rekordy). Ponieważ dane są już podzielone, usunięcie duplikatów przez aparat bazy danych nie dodaje żadnej wartości, a jedynie dodaje dodatkowy czas przetwarzania zapytań.