Szukaj…


Wprowadzenie

Słowo kluczowe UNION w SQL jest używane do łączenia wyników instrukcji SELECT bez duplikatów. Aby użyć UNION i połączyć wyniki, obie instrukcje SELECT powinny mieć tę samą liczbę kolumn o tym samym typie danych w tej samej kolejności, ale długość kolumny może być inna.

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ń.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow