I SQL bruges UNION- operatoren til at forbinde to sæt rækker, der returneres af SQL-forespørgsler. Begge forespørgsler skal returnere det samme antal kolonner, og kolonner med samme ordinal skal have kompatible datatyper . Resultatet modtager strukturen (navne og kolonnetyper) af den første (venstre) forespørgsel, det vil sige, at operationen ikke er symmetrisk.
Når du kombinerer flere forespørgsler i en række, beregnes resultatet sekventielt fra venstre mod højre.
Denne operatør blev beskrevet i den første SQL-standard - SQL/89 [1] .
Operatøren er specificeret mellem anmodninger. I forenklet form ser det sådan ud:
< forespørgsel 1 > UNION [ ALLE ] < forespørgsel 2 > UNION [ ALLE ] < forespørgsel 3 > .....;Som standard skjules alle duplikerede poster automatisk, medmindre udtrykket bruges UNION ALL.
Det skal bemærkes, at det UNIONi sig selv ikke garanterer rækkefølgen af rækkerne. Linjerne fra den anden forespørgsel kan vises i begyndelsen, i slutningen eller endda blandes med linjerne fra den første forespørgsel. I de tilfælde, hvor der kræves en bestemt rækkefølge, skal der bruges et udtryk ORDER BY.
Der er to hovedregler for brugen af operatøren UNION:
Datatyperne for de kolonner, hvorfra dataene hentes i de kombinerede forespørgsler, behøver ikke være nøjagtig de samme, men skal være kompatible gennem implicit konvertering. Hvis datatyperne er forskellige, bestemmes den resulterende datatype baseret på datatypeforrangsreglerne (for et bestemt DBMS). Hvis typerne matcher, men adskiller sig i præcision, skala eller længde, bestemmes resultatet ud fra de regler, der bruges til at kombinere udtryk (for et bestemt DBMS) [2] . Ikke-ANSI-typer, såsom DATA og BINÆR, bør normalt matche andre kolonner af samme ikke-standardtype [3] .
I Microsoft SQL Server skal XML-datatypekolonner være ækvivalente. Alle kolonner skal enten have en type defineret i XML-skemaet eller være utype. Indtastede kolonner skal referere til den samme samling af XML-skemaer [2] .
En anden kompatibilitetsbegrænsning er at forbyde null-værdier (NULL) i enhver join-kolonne, og disse værdier skal også være udelukket for alle tilsvarende kolonner i andre join-forespørgsler, da null-værdier (NULL) er forbudt med NOT NULL begrænsning. Du kan heller ikke bruge UNION i underforespørgsler, og du kan ikke bruge aggregerede funktioner i SELECT-sætningen af en forespørgsel i en union (de fleste DBMS'er ignorerer dog disse begrænsninger) [3] .
UNIONkan være meget nyttig i data warehousing applikationer, hvor tabeller sjældent er perfekt normaliseret . Et simpelt eksempel: der er tabeller i databasen sales2005og sales2006, som har en identisk struktur, men er adskilt af hensyn til ydeevnen. En word-forespørgsel UNIONgiver dig mulighed for at kombinere resultater fra begge tabeller.
Det er også værd at bemærke, at det UNION ALLvirker hurtigere end bare UNION, fordi som standard, når du bruger operatøren, UNIONudføres yderligere eliminering af dubletter, men når du bruger det UNION ALL, er det ikke [4] .
To tabeller er givet:
person | beløb |
---|---|
Ivan | 1000 |
Alexei | 2000 |
Sergey | 5000 |
person | beløb |
---|---|
Ivan | 2000 |
Alexei | 2000 |
Peter | 35.000 |
Når du udfører følgende forespørgsel:
( SELECT * FROM sales2005 ) UNION ( SELECT * FROM sales2006 );et resultatsæt opnås, men rækkefølgen af rækkerne kan ændres vilkårligt, fordi nøgleudtrykket ORDER BYikke blev brugt:
person | beløb |
---|---|
Ivan | 1000 |
Alexei | 2000 |
Ivan | 2000 |
Sergey | 5000 |
Peter | 35.000 |
Som et resultat vil to rækker med Ivan blive vist, da disse rækker er forskellige i værdierne i kolonnerne. Men på samme tid er der kun én række med Alexey i resultatet, da værdierne i kolonnerne stemmer fuldstændig overens.
Anvendelse UNION ALLgiver et andet resultat, fordi dubletter ikke er skjult. Udførelse af en anmodning:
( SELECT * FROM sales2005 ) UNION ALL ( SELECT * FROM sales2006 );vil give følgende resultat, vist uden bestilling på grund af fraværet af udtrykket ORDER BY:
person | beløb |
---|---|
Ivan | 1000 |
Ivan | 2000 |
Alexei | 2000 |
Alexei | 2000 |
Sergey | 5000 |
Peter | 35.000 |
På samme måde er det muligt at forbinde to forskellige forespørgsler fra samme tabel (selvom i stedet, som regel, er de nødvendige parametre kombineret i én forespørgsel ved hjælp af AND- og OR-nøgleordene i WHERE-sætningen):
( VÆLG person , beløb FRA salg2005 HVOR beløb = 1000 ) UNION ( VÆLG person , beløb FRA salg 2005 HVOR person som 'Sergey' );Resultatet bliver:
person | beløb |
---|---|
Ivan | 1000 |
Sergey | 5000 |
Du UNIONkan også oprette fulde ydre sammenføjninger med den (bruges nogle gange, når der ikke er indbygget direkte understøttelse af udvendige sammenføjninger):
( VÆLG * FRA medarbejder LEFT JOIN afdeling PÅ medarbejder . AfdelingsID = afdeling . AfdelingsID ) UNION ( VÆLG * FRA medarbejder HØJRE JOIN afdeling PÅ medarbejder . AfdelingsID = afdeling . AfdelingsID );Men samtidig skal man huske, at det stadig ikke er det samme som operatøren JOIN.
Punkt 4 - ikke-fungerende link (pr. 11/08/2012)
SQL | |
---|---|
Versioner |
|
Nøgleord | |
Relaterede artikler | |
Dele af ISO/IEC SQL |
|
Database | |
---|---|
Begreber |
|
Objekter | |
Nøgler | |
SQL | |
Komponenter |