SQL : ssä UNION- operaattoria käytetään yhdistämään kaksi riviä, jotka SQL-kyselyt palauttavat. Molempien kyselyiden on palautettava sama määrä sarakkeita, ja sarakkeilla, joilla on sama järjestysluku, on oltava yhteensopivia tietotyyppejä . Tulos saa ensimmäisen (vasemman) kyselyn rakenteen (sarakkeiden nimet ja tyypit), eli toiminto ei ole symmetrinen.
Kun useita kyselyitä yhdistetään peräkkäin, tulos lasketaan peräkkäin vasemmalta oikealle.
Tämä operaattori on kuvattu ensimmäisessä SQL-standardissa - SQL/89 [1] .
Operaattori määritellään pyyntöjen välillä. Yksinkertaistetussa muodossa se näyttää tältä:
< kysely 1 > UNIONI [ KAIKKI ] < kysely 2 > YHDISTYNYT [ KAIKKI ] < kysely 3 > .....;Oletusarvoisesti kaikki päällekkäiset merkinnät piilotetaan automaattisesti, ellei lauseketta käytetä UNION ALL.
On huomattava, että UNIONse ei itsessään takaa rivien järjestystä. Toisen kyselyn rivit voivat näkyä alussa, lopussa tai jopa sekoittua ensimmäisen kyselyn rivien kanssa. Tapauksissa, joissa vaaditaan tietty järjestys, on käytettävä lauseketta ORDER BY.
Operaattorin käyttöä säätelee kaksi pääsääntöä UNION:
Niiden sarakkeiden tietotyyppien, joista tiedot haetaan yhdistetyissä kyselyissä, ei tarvitse olla täsmälleen samat, vaan niiden on oltava yhteensopivia implisiittisen muunnoksen avulla. Jos tietotyypit eroavat toisistaan, tuloksena oleva tietotyyppi määritetään tietotyypin ensisijaisuussääntöjen perusteella (tietylle DBMS:lle). Jos tyypit täsmäävät, mutta eroavat tarkkuuden, mittakaavan tai pituuden suhteen, tulos määritetään lausekkeiden yhdistämiseen käytettyjen sääntöjen perusteella (tietylle DBMS:lle) [2] . Ei-ANSI-tyyppien, kuten DATA ja BINARY, tulisi normaalisti vastata muita saman ei-standardityypin sarakkeita [3] .
Microsoft SQL Serverissä XML - tietotyyppisarakkeiden on oltava vastaavia. Kaikilla sarakkeilla on oltava joko XML-skeemassa määritetty tyyppi tai niiden on oltava kirjoittamattomia. Kirjoitettujen sarakkeiden on viitattava samaan XML-skeemojen kokoelmaan [2] .
Toinen yhteensopivuusrajoitus on kieltää nolla-arvot (NULL) missä tahansa liitossarakkeessa, ja nämä arvot on myös estettävä kaikissa vastaavissa sarakkeissa muissa liitoskyselyissä, koska nolla-arvot (NULL) ovat kiellettyjä NOT NULL:n kanssa. rajoite. Et myöskään voi käyttää UNION-toimintoa alikyselyissä, etkä voi käyttää yhdistelmäfunktioita kyselyn SELECT-lauseessa liitossa (useimmat tietokantajärjestelmät eivät kuitenkaan huomioi näitä rajoituksia) [3] .
UNIONvoi olla erittäin hyödyllinen tietovarastointisovelluksissa, joissa taulukot ovat harvoin täysin normalisoituja . Yksinkertainen esimerkki: tietokannassa on taulukoita sales2005ja sales2006, joilla on identtinen rakenne, mutta jotka on erotettu toisistaan suorituskyvyn vuoksi. Sanakyselyn UNIONavulla voit yhdistää tuloksia molemmista taulukoista.
On myös syytä huomata, että se UNION ALLtoimii nopeammin kuin pelkkä UNION, koska oletusarvoisesti operaattoria käytettäessä UNIONsuoritetaan ylimääräinen kaksoiskappaleiden eliminointi, mutta sitä käytettäessä se UNION ALLei [4] .
Tarjolla on kaksi taulukkoa:
henkilö | määrä |
---|---|
Ivan | 1000 |
Aleksei | 2000 |
Sergei | 5000 |
henkilö | määrä |
---|---|
Ivan | 2000 |
Aleksei | 2000 |
Peter | 35 000 |
Kun suoritat seuraavan kyselyn:
( SELECT * FROM sales2005 ) UNION ( SELECT * FROM sales2006 );tulosjoukko saadaan, mutta rivien järjestys voi muuttua mielivaltaisesti, koska avainlauseketta ORDER BYei käytetty:
henkilö | määrä |
---|---|
Ivan | 1000 |
Aleksei | 2000 |
Ivan | 2000 |
Sergei | 5000 |
Peter | 35 000 |
Tämän seurauksena näytetään kaksi riviä Ivanilla, koska nämä rivit eroavat sarakkeiden arvoista. Mutta samaan aikaan tuloksessa on vain yksi rivi Aleksein kanssa, koska sarakkeiden arvot vastaavat täysin.
Käyttöönotto UNION ALLantaa erilaisen tuloksen, koska kaksoiskappaleita ei piiloteta. Pyynnön suorittaminen:
( SELECT * FROM sales2005 ) UNION ALL ( SELECT * FROM sales2006 );antaa seuraavan tuloksen, joka näytetään ilman järjestystä lausekkeen puuttumisen vuoksi ORDER BY:
henkilö | määrä |
---|---|
Ivan | 1000 |
Ivan | 2000 |
Aleksei | 2000 |
Aleksei | 2000 |
Sergei | 5000 |
Peter | 35 000 |
Vastaavasti on mahdollista yhdistää kaksi eri kyselyä samasta taulukosta (vaikka sen sijaan yleensä tarvittavat parametrit yhdistetään yhteen kyselyyn käyttämällä WHERE-lauseen avainsanoja AND ja OR):
( SELECT henkilö , määrä myynnistä2005 WHERE määrä = 1000 ) UNIONI ( SELECT henkilö , määrä myynnistä2005 WHERE henkilö kuten ' Sergey ' );Tuloksena tulee olemaan:
henkilö | määrä |
---|---|
Ivan | 1000 |
Sergei | 5000 |
Voit UNIONmyös luoda sen avulla täydellisiä ulkoliitoksia (joskus käytetään, kun ulkoliitoksille ei ole sisäänrakennettua suoraa tukea):
( SELECT * FROM työntekijästä LEFT JOIN osasto työntekijä . OsastoID = osasto . Osaston ID ) UNIONIN ( SELECT * FROM työntekijästä OIKEA LIITTY osasto työntekijälle . Osaston ID = osasto . Osaston ID )Mutta samalla on muistettava, että tämä ei silti ole sama asia kuin operaattori JOIN.
Kohde 4 - linkki ei toimi (11.8.2012)
SQL | |
---|---|
Versiot |
|
Avainsanat | |
Aiheeseen liittyvät artikkelit | |
ISO/IEC SQL:n osat |
|
Tietokanta | |
---|---|
Käsitteet |
|
Objektit |
|
Avaimet | |
SQL | |
Komponentit |