Az SQL -ben az UNION operátor az SQL-lekérdezések által visszaadott két sor egyesítésére szolgál . Mindkét lekérdezésnek ugyanannyi oszlopot kell visszaadnia, és az azonos sorszámmal rendelkező oszlopoknak kompatibilis adattípusokkal kell rendelkezniük . Az eredmény az első (bal oldali) lekérdezés szerkezetét (oszlopok nevét és típusát) kapja, vagyis a művelet nem szimmetrikus.
Ha több lekérdezést kombinál egy sorban, az eredmény balról jobbra haladva egymás után számítódik ki.
Ezt az operátort az első SQL szabvány - SQL/89 [1] - írta le .
Az operátor a kérések között van megadva. Egyszerűsített formában így néz ki:
< 1. lekérdezés > UNIÓ [ MINDEN ] < 2. lekérdezés > UNIÓ [ MINDEN ] < 3. lekérdezés > .....;Alapértelmezés szerint az ismétlődő bejegyzések automatikusan el vannak rejtve, hacsak nem használják a kifejezést UNION ALL.
Meg kell jegyezni, hogy UNIONönmagában nem garantálja a sorok sorrendjét. A második lekérdezés sorai megjelenhetnek az elején, a végén, vagy akár keveredhetnek is az első lekérdezés soraival. Azokban az esetekben, amikor meghatározott sorrendre van szükség, kifejezést kell használni ORDER BY.
Az operátor használatára két fő szabály vonatkozik UNION:
Azon oszlopok adattípusainak, amelyekből az adatokat lekérik a kombinált lekérdezésekben, nem kell pontosan azonosnak lenniük, de implicit konverzión keresztül kompatibilisnek kell lenniük. Ha az adattípusok különböznek, akkor az eredményül kapott adattípust az adattípus elsőbbségi szabályai alapján határozzák meg (egy adott DBMS-hez). Ha a típusok megegyeznek, de pontosságban, léptékben vagy hosszban különböznek, az eredményt a kifejezések kombinálására használt szabályok alapján határozzák meg (egy adott DBMS-hez) [2] . A nem ANSI típusoknak, mint például a DATA és a BINARY, általában meg kell egyezniük ugyanazon nem szabványos típusú oszlopokkal [3] .
A Microsoft SQL Server rendszerben az XML adattípus oszlopoknak egyenértékűnek kell lenniük. Minden oszlopnak vagy típusának kell lennie az XML-sémában, vagy típus nélkülinek kell lennie. A beírt oszlopoknak ugyanarra az XML-sémagyűjteményre kell hivatkozniuk [2] .
Egy másik kompatibilitási megkötés, hogy a null értékeket (NULL) le kell tiltani bármely összekapcsolási oszlopban, és ezeket az értékeket az összes megfelelő oszlopban is le kell tiltani más összekapcsolási lekérdezésekben, mivel a null értékek (NULL) tiltottak a NOT NULL mellett. kényszer. Ezenkívül nem használhatja az UNION-t az allekérdezésekben, és nem használhat aggregált függvényeket a lekérdezések SELECT záradékában egy unióban (a legtöbb DBMS azonban figyelmen kívül hagyja ezeket a korlátozásokat) [3] .
UNIONnagyon hasznos lehet adattárház alkalmazásokban , ahol a táblák ritkán vannak tökéletesen normalizálva . Egy egyszerű példa: vannak az adatbázisban sales2005és a táblák sales2006, amelyek felépítése megegyezik, de a teljesítmény kedvéért elkülönítve vannak. A szólekérdezés UNIONlehetővé teszi a két tábla eredményeinek kombinálását.
Azt is érdemes megjegyezni, hogy UNION ALLgyorsabban működik, mint a UNION, mert alapértelmezés szerint az operátor használatakor a UNIONduplikációk további eltávolítása történik, de használatakor UNION ALLnem [4] .
Két táblázat található:
személy | összeg |
---|---|
Ivan | 1000 |
Alekszej | 2000 |
Szergej | 5000 |
személy | összeg |
---|---|
Ivan | 2000 |
Alekszej | 2000 |
Péter | 35000 |
A következő lekérdezés végrehajtásakor:
( SELECT * FROM sales2005 ) UNION ( SELECT * FROM sales2006 );eredményhalmazt kapunk, de a sorok sorrendje tetszőlegesen változhat, mivel a kulcskifejezést ORDER BYnem használták:
személy | összeg |
---|---|
Ivan | 1000 |
Alekszej | 2000 |
Ivan | 2000 |
Szergej | 5000 |
Péter | 35000 |
Ennek eredményeként két sor jelenik meg Ivannal, mivel ezek a sorok különböznek az oszlopokban lévő értékekben. De ugyanakkor csak egy sor van Alexey-vel az eredményben, mivel az oszlopok értékei teljesen megegyeznek.
Az alkalmazás UNION ALLmás eredményt ad, mert a másolatok nincsenek elrejtve. Kérelem teljesítése:
( SELECT * FROM sales2005 ) UNION ALL ( SELECT * FROM sales2006 );a következő eredményt adja, a kifejezés hiánya miatt sorrend nélkül megjelenítve ORDER BY:
személy | összeg |
---|---|
Ivan | 1000 |
Ivan | 2000 |
Alekszej | 2000 |
Alekszej | 2000 |
Szergej | 5000 |
Péter | 35000 |
Hasonlóképpen lehetséges két különböző lekérdezés összekapcsolása ugyanabból a táblából (bár ehelyett általában a szükséges paraméterek egy lekérdezésben vannak kombinálva a WHERE záradékban található AND és OR kulcsszavak használatával):
( SELECT személy , összeg FROM értékesítés2005 WHERE összeg = 1000 ) UNION ( SELECT személy , összeg FROM sales2005 WHERE személy , mint 'Sergej' );Az eredmény a következő lesz:
személy | összeg |
---|---|
Ivan | 1000 |
Szergej | 5000 |
Teljes külső illesztéseket is UNIONlétrehozhat vele (néha akkor használják, ha nincs beépített közvetlen támogatás a külső illesztésekhez):
( SELECT * FROM alkalmazott BAL JOIN részleg ON alkalmazott . Osztályazonosító = osztály . Osztályazonosító ) UNION ( SELECT * FROM alkalmazott JOBB JOIN részleg ON alkalmazott . Osztályazonosító = osztály . Osztályazonosító );Ugyanakkor emlékeznünk kell arra, hogy ez még mindig nem ugyanaz, mint az operátor JOIN.
4. tétel – nem működő link (2012.11.08.)
SQL | |
---|---|
Verziók |
|
Kulcsszavak |
|
Kapcsolódó cikkek | |
Az ISO/IEC SQL részei |
|
Adatbázis | |
---|---|
Fogalmak |
|
Objektumok |
|
Kulcsok | |
SQL |
|
Alkatrészek |