V SQL se operátor UNION používá ke spojení dvou sad řádků vrácených dotazy SQL. Oba dotazy musí vracet stejný počet sloupců a sloupce se stejným pořadovým číslem musí mít kompatibilní datové typy . Výsledek obdrží strukturu (názvy a typy sloupců) prvního (levého) dotazu, to znamená, že operace není symetrická.
Při kombinování více dotazů za sebou se výsledek počítá postupně zleva doprava.
Tento operátor byl popsán v prvním SQL standardu - SQL/89 [1] .
Operátor je uveden mezi požadavky. Ve zjednodušené podobě to vypadá takto:
< dotaz 1 > UNION [ VŠECHNY ] < dotaz 2 > UNION [ VŠE ] < dotaz 3 > .....;Ve výchozím nastavení jsou všechny duplicitní položky automaticky skryty, pokud není použit výraz UNION ALL.
Je třeba poznamenat, že UNIONsamo o sobě nezaručuje pořadí řádků. Řádky z druhého dotazu se mohou objevit na začátku, na konci nebo se dokonce smísit s řádky z prvního dotazu. V případech, kdy je vyžadována konkrétní objednávka, je třeba použít výraz ORDER BY.
Používání operátora se řídí dvěma hlavními pravidly UNION:
Datové typy sloupců, ze kterých jsou data načítána v kombinovaných dotazech, nemusí být přesně stejné, ale musí být kompatibilní prostřednictvím implicitního převodu. Pokud se datové typy liší, pak je výsledný datový typ určen na základě pravidel priority datových typů (pro konkrétní DBMS). Pokud se typy shodují, ale liší se přesností, měřítkem nebo délkou, je výsledek určen na základě pravidel použitých pro kombinování výrazů (pro konkrétní DBMS) [2] . Typy jiné než ANSI, jako jsou DATA a BINARY, by se normálně měly shodovat s jinými sloupci stejného nestandardního typu [3] .
V Microsoft SQL Server musí být sloupce datového typu XML ekvivalentní. Všechny sloupce musí mít buď typ definovaný ve schématu XML, nebo musí být bez typu. Typované sloupce musí odkazovat na stejnou kolekci schémat XML [2] .
Dalším omezením kompatibility je zakázání hodnot null (NULL) v libovolném sloupci spojení a tyto hodnoty musí být také zakázány pro všechny odpovídající sloupce v jiných dotazech na spojení, protože hodnoty null (NULL) jsou zakázány s hodnotou NOT NULL. omezení. Také nemůžete použít UNION v poddotazech a nemůžete použít agregační funkce v klauzuli SELECT dotazu v unii (většina DBMS však tato omezení ignoruje) [3] .
UNIONmůže být velmi užitečné v aplikacích pro datové sklady, kde jsou tabulky zřídka dokonale normalizovány . Jednoduchý příklad: v databázi jsou tabulky sales2005a sales2006, které mají identickou strukturu, ale jsou kvůli výkonu odděleny. Slovní dotaz UNIONumožňuje kombinovat výsledky z obou tabulek.
Za zmínku také stojí, že UNION ALLfunguje rychleji než jen UNION, protože ve výchozím nastavení se při použití operátoru UNIONprovádí dodatečná eliminace duplicit, ale při jeho použití tomu UNION ALLtak není [4] .
Jsou uvedeny dvě tabulky:
osoba | množství |
---|---|
Ivane | 1000 |
Alexeji | 2000 |
Sergeji | 5000 |
osoba | množství |
---|---|
Ivane | 2000 |
Alexeji | 2000 |
Petr | 35 000 |
Při provádění následujícího dotazu:
( SELECT * FROM sales2005 ) UNION ( SELECT * FROM sales2006 );je získána sada výsledků, ale pořadí řádků se může libovolně změnit, protože ORDER BYnebyl použit klíčový výraz:
osoba | množství |
---|---|
Ivane | 1000 |
Alexeji | 2000 |
Ivane | 2000 |
Sergeji | 5000 |
Petr | 35 000 |
V důsledku toho se zobrazí dva řádky s Ivanem, protože tyto řádky se liší v hodnotách ve sloupcích. Ale zároveň je ve výsledku pouze jeden řádek s Alexey, protože hodnoty ve sloupcích se zcela shodují.
Použití UNION ALLdává jiný výsledek, protože duplikáty nejsou skryté. Vyřízení požadavku:
( SELECT * FROM sales2005 ) UNION ALL ( SELECT * FROM sales2006 );poskytne následující výsledek zobrazený bez řazení kvůli absenci výrazu ORDER BY:
osoba | množství |
---|---|
Ivane | 1000 |
Ivane | 2000 |
Alexeji | 2000 |
Alexeji | 2000 |
Sergeji | 5000 |
Petr | 35 000 |
Podobně je možné spojit dva různé dotazy ze stejné tabulky (ačkoli místo toho se zpravidla potřebné parametry spojí do jednoho dotazu pomocí klíčových slov AND a OR v klauzuli WHERE):
( SELECT osoba , částka FROM sales2005 WHERE částka = 1000 ) UNION ( SELECT person , částka FROM sales2005 WHERE osoba jako 'Sergey' );Výsledkem bude:
osoba | množství |
---|---|
Ivane | 1000 |
Sergeji | 5000 |
Můžete s ním UNIONtaké vytvářet úplné vnější spojení (někdy se používá, když není vestavěná přímá podpora pro vnější spojení):
( SELECT * FROM zaměstnance LEFT JOIN oddělení ON zaměstnanec . DepartmentID = oddělení . DepartmentID ) UNION ( SELECT * FROM zaměstnance RIGHT JOIN oddělení ON zaměstnanec . DepartmentID = oddělení . DepartmentID );Zároveň je ale třeba připomenout, že to stále není totéž jako operátor JOIN.
Položka 4 – nefunkční odkaz (stav k 11.08.2012)
SQL | |
---|---|
Verze |
|
Klíčová slova | |
Související články | |
Části ISO/IEC SQL |
|
Databáze | |
---|---|
Koncepty |
|
Objekty |
|
Klíče | |
SQL | |
Komponenty |