Noen ganger vil du kanskje føre opp postene fra én tabell eller spørring med postene fra én eller flere andre tabeller for å lage ett sett med poster – en liste med alle postene fra to eller flere tabeller. Dette er hensikten med unionsspørring i Access.
For at du skal forstå unionsspørring, bør du først gjøre deg kjent med å utforme grunnleggende utvalgsspørringer i Access. Hvis du vil finne ut mer om utforming av utvalgsspørringer, kan du se Opprette en enkel utvalgsspørring.
Utforske et eksempel på en fungerende unionsspørring
Hvis du noen gang har opprettet en unionsspørring tidligere, kan det hende du kan dra nytte av et fungerende eksempel i Northwind-malen i Access. Du kan søke etter Northwind-eksempelmalen på Kom i gang-siden i Access ved å klikke på Fil > Ny, eller du kan laste den ned direkte fra denne plasseringen: Northwind-eksempelmal.
Når Access åpner Northwind-databasen, lukker du påloggingsdialogboksen som først vises, og deretter utvider du navigasjonsruten. Klikk øverst i navigasjonsruten, og velg deretter Objekttype for å organisere alle databaseobjektene etter type. Deretter utvider du Spørringer-gruppen , og du ser en spørring kalt Produkttransaksjoner.
Unionsspørringer er enkle å skille fra andre spørringsobjekter fordi de har et spesialikon som ligner på to sammenflettede sirkler, som representerer et forenet sett fra to ulike sett:
I motsetning til vanlige utvalgs- og redigeringsspørringer er tabeller ikke relatert i en unionsspørring, noe som betyr at spørringsutformeren for Access-grafikk ikke kan brukes til å bygge eller redigere unionsspørringer. Du vil oppleve dette hvis du åpner en unionsspørring fra navigasjonsruten. Access åpner den og viser resultatene i dataarkvisning. Under Visninger-kommandoen på Hjem-fanen ser du at utformingsvisning ikke er tilgjengelig når du arbeider med unionsspørringer. Du kan bare bytte mellom dataarkvisning og SQL-visning når du arbeider med unionsspørringer.
Hvis du vil fortsette utforskingen av eksemplet på unionsspørring, klikker du på Hjem > Visninger > SQL-visning for å vise SQL-syntaksen som definerer den. I denne illustrasjonen har vi lagt til litt ekstra mellomrom i SQL-syntaksen, slik at du enkelt kan de se ulike delene som utgjør en unionsspørring.
La oss se på SQL-syntaksen i denne unionsspørringen fra Northwind-databasen i detalj:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Den første og tredje delen av denne SQL-setningen er i hovedsak to utvalgsspørringer. Disse spørringene henter to forskjellige sett med poster: ett sett fra tabellen Produktordrer og et annet sett fra tabellen Produktkjøp.
Den andre delen av denne SQL-setningen er UNION-nøkkelordet som forteller Access at denne spørringen kombinerer to sett med poster.
Den siste delen av denne SQL-setningen fastslår rekkefølgen av de kombinerte postene ved å bruke en ORDER BY-setning. I dette eksemplet sorterer Access alle postene etter Ordredato-feltet i synkende rekkefølge.
Obs!: Unionsspørringer er alltid skrivebeskyttet i Access, du kan ikke endre noen verdier i dataarkvisning.
Opprette en unionsspørring ved å opprette og kombinere utvalgsspørringer
Selv om du kan opprette en unionsspørring ved å skrive SQL-syntaksen direkte inn i SQL-visningen, kan det hende det er enklere å bygge den opp ved bruk av utvalgsspørringer. Du kan deretter kopiere og lime inn SQL-delene i en kombinert unionsspørring.
Hvis du vil hoppe over instruksjonene om trinnene og heller se et eksempel, kan du lese den neste inndelingen Se et eksempel på hvordan du bygger en unionsspørring.
-
Klikk Spørringsutforming i Spørringer-gruppen i kategorien Opprett.
-
Dobbeltklikk tabellen som inneholder feltene du vil inkludere. Tabellen legges til i utformingsvisningen for spørringen.
-
I utformingsvisningen for spørringen dobbeltklikker du hvert av feltene du vil ta med. Når du velger felt, må du påse at du legger til samme antall felt som du legger til i de andre utvalgsspørringene og at feltene står i samme rekkefølge. Følg svært nøye med på datatypene til feltene, og påse at de har datatyper som er kompatible med feltene i samme posisjon i de andre spørringene du kombinerer. Hvis den første utvalgsspørringen for eksempel har fem felt, der det første inneholder dato-/klokkeslettdata, må du påse at hver av de andre utvalgsspørringene som du kombinerer, også har fem felt, der det første inneholder dato-/klokkeslettdata, og så videre.
-
Hvis du ønsker det, kan du legge til vilkår i feltene ved å skrive de aktuelle uttrykkene i Vilkår-raden i feltrutenettet.
-
Etter at du er ferdig med å legge til felter og feltvilkår, kjører du utvalgsspørringen og ser gjennom utdataene. Klikk på Kjør i Resultater-gruppen på Utforming-fanen.
-
Bytt til utformingsvisning for spørringen.
-
Lagre utvalgsspørringen, og la den stå åpen.
-
Gjenta denne prosessen for hver av utvalgsspørringene du vil kombinere.
Når du nå har opprettet utvalgsspørringene, kan du kombinere dem. I dette trinnet oppretter du unionsspørringen ved å kopiere og lime inn SQL-setninger.
-
Klikk Spørringsutforming i Spørringer-gruppen i kategorien Opprett.
-
Klikk på Union i Spørring-gruppen på Utforming-fanen. Access skjuler spørringsutformingsvinduet og viser objektfanen SQL-visning. Nå er objektfanen SQL-visning tom.
-
Klikk på fanen for den første utvalgsspørringen du vil kombinere i unionsspørringen.
-
Klikk på Visning > SQL-visning på Hjem-fanen.
-
Kopier SQL-setningen for utvalgsspørringen. Klikk på fanen for unionsspørringen som du begynte å opprette tidligere.
-
Lim SQL-setningen for utvalgsspørringen inn i objektkategorien SQL-visning i unionsspørringen.
-
Slett semikolonet (;) på slutten av SQL-setningen for utvalgsspørringen.
-
Trykk på ENTER for å bevege markøren ned én linje, og skriv deretter UNION på den nye linjen.
-
Klikk kategorien for den neste utvalgsspørringen som du vil kombinere i unionsspørringen.
-
Gjenta trinn 5 til 10 til du har kopiert og limt inn alle SQL-setningene for utvalgsspørringene i SQL-visningsvinduet i unionsspørringen. Ikke slett semikolonet eller skriv noe etter SQL-setningen i den siste spørringen.
-
Klikk Kjør i Resultater-gruppen i kategorien Utforming.
Resultatene av unionsspørringen vises i dataarkvisning.
Se et eksempel på hvordan du bygger en unionsspørring
Her ser du et eksempel du kan gjenskape i eksempeldatabasen for Northwind. Denne unionsspørringen samler inn navnene på personene fra tabellen Kunder og kombinerer dem med navnene på personene fra tabellen Leverandører. Hvis du vil følge med i denne opplæringen, går du gjennom trinnene i din kopi av eksempeldatabasen for Northwind.
Her ser du de nødvendige trinnene for å bygge dette eksemplet:
-
Opprett to spørringer med navn Spørring1 og Spørring2 med henholdsvis tabellene Kunder og Leverandører som datakilder. Bruk Fornavn- og Etternavn-feltet som visningsverdier.
-
Opprett en ny spørring med navn Spørring3 uten datakilde i utgangspunktet, og klikk deretter på kommandoen Union på Utforming-fanen for å gjøre denne spørringen til en unionsspørring.
-
Kopier og lim inn SQL-setningene fra Spørring1 og Spørring2 i Spørring3. Sørg for at du fjerner det ekstra semikolonet og legger til UNION-nøkkelordet. Du kan deretter se resultatene i dataarkvisningen.
-
Legg til en ordresetning i én av spørringene, og lim deretter inn ORDER BY-setningen i SQL-visningen til unionsspørringen. Vær oppmerksom på følgende: når ordren endres i Spørring3, unionsspørringen, fjernes først semikolonet og deretter tabellnavnet fra feltnavnene.
-
Den siste SQL-setningen som kombinerer og sorterer navnene for dette eksemplet på unionsspørring er følgende:
SELECT Customers.Company, Customers.[Last Name], Customers.[First Name] FROM Customers UNION SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name] FROM Suppliers ORDER BY [Last Name], [First Name];
Hvis du har erfaring med å skrive SQL-syntaks, kan du bare skrive dine egne setninger for unionsspørringen direkte inn i SQL-visningen. Det kan imidlertid være nyttig å følge fremgangsmåten der du kopierer og limer inn SQL-setninger fra andre spørringsobjekter. Hver spørring kan være enda mer komplisert enn de enkle eksemplene på utvalgsspørringer som er brukt her. Det kan være til din fordel å opprette og teste hver spørring nøye før du kombinerer dem i en unionsspørring. Hvis unionsspørringen ikke kjører, kan du justere hver spørring individuelt til den lykkes, og deretter kan du bygge unionsspørringen på nytt med den endrede syntaksen.
Se gjennom de gjenværende inndelingene i denne artikkelen for flere tips om hvordan du bruker unionsspørringer.
I eksemplet fra den forrige inndelingen som brukte Northwind-databasen, ble bare data fra to tabeller kombinert. Du kan imidlertid kombinere tre eller flere tabeller på en enkel måte i en unionsspørring. Du kan for eksempel, ved å fortsette på det forrige eksemplet, inkludere navnen på de ansatte i spørringsutdataene. Dette gjør du ved å legge til en tredje spørring og kombinere den forrige SQL-setningen med et nytt UNION-nøkkelord som dette:
SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
FROM Customers
UNION
SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers
UNION
SELECT Employees.Company, Employees.[Last Name], Employees.[First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Når du viser resultatet i dataarkvisning, vil alle ansatte bli oppført med eksempelet på firmanavn, noe som sannsynligvis ikke er veldig nyttig. Hvis du vil at feltet skal angi om en person er en internt ansatt, fra en leverandør eller fra en kunde, kan du inkludere en fast verdi i stedet for firmanavnet. Slik vil SQL-setningen se ut:
SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
UNION
SELECT "Supplier" As Employment, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers
UNION
SELECT "In-house" As Employment, Employees.[Last Name], Employees.[First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Slik vises resultatet i dataarkvisning. Access vises disse fem eksempelpostene:
Ansettelse |
Etternavn |
Fornavn |
Internt |
Freehafer |
Nancy |
Internt |
Giussani |
Laura |
Leverandør |
Glasson |
Stuart |
Kunde |
Goldschmidt |
Daniel |
Kunde |
Gratacos Solsona |
Antonio |
Spørringen ovenfor kan reduserer ytterligere da Access bare leser navnene på utdatafeltene fra den første spørringen i en unionsspørring. Her kan du se at vi har fjernet utdataene fra inndelingene til andre og tredje spørring:
SELECT "Customer" As Employment, [Last Name], [First Name]
FROM Customers
UNION
SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
UNION
SELECT "In-house", [Last Name], [First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Bestilling er bare tillatt én gang, men hver spørring kan filtreres enkeltvis, i en unionsspørring i Access. Ved å fortsette på unionsspørringen fra forrige inndeling ser du her et eksempel hvor vi har filtrert hver spørring ved å legge til en WHERE-setning.
SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
WHERE [State/Province] = "UT"
UNION
SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
WHERE [Job Title] = "Sales Manager"
UNION
SELECT "In-house", Employees.[Last Name], Employees.[First Name]
FROM Employees
WHERE City = "Seattle"
ORDER BY [Last Name], [First Name];
Bytt til dataarkvisning, og du ser da resultater som ligner på disse:
Ansettelse |
Etternavn |
Fornavn |
Leverandør |
Andersen |
Elizabeth A. |
Internt |
Freehafer |
Nancy |
Kunde |
Hasselberg |
Jonas |
Internt |
Hellung Larsen |
Anne |
Leverandør |
Hernandez-Echevarria |
Amaya |
Kunde |
Mortensen |
Sven |
Leverandør |
Sandberg |
Mikael |
Leverandør |
Åmodt |
Tormod |
Internt |
Thorpe |
Steven |
Leverandør |
Weiler |
Cornelia |
Internt |
Zare |
Robert |
Hvis spørringene til unionen er svært forskjellige, kan det hende du støter på en situasjon der et utdatafelt må kombinere data fra forskjellige datatyper. I så fall vil unionsspørringen oftest returnere resultatene som en tekstdatatype, siden denne datatypen kan inneholde både tekst og tall.
Hvis du vil forstå hvordan dette fungerer, bruker vi unionsspørringen Produkttransaksjoner i eksempeldatabasen for Northwind. Åpne eksempeldatabasen, og åpne deretter Produkttransaksjoner-spørringen i dataarkvisning. De siste ti postene skal ligne på disse utdataene:
Produkt-ID |
Ordredato |
Firmanavn |
Transaksjon |
Antall |
77 |
22.01.2006 |
Leverandør B |
Kjøp |
60 |
80 |
22.01.2006 |
Leverandør D |
Kjøp |
75 |
81 |
22.01.2006 |
Leverandør A |
Kjøp |
125 |
81 |
22.01.2006 |
Leverandør A |
Kjøp |
200 |
7 |
20.01.2006 |
Firma D |
Salg |
10 |
51 |
20.01.2006 |
Firma D |
Salg |
10 |
80 |
20.01.2006 |
Firma D |
Salg |
10 |
34 |
15.01.2006 |
Firma AA |
Salg |
100 |
80 |
15.01.2006 |
Firma AA |
Salg |
30 |
La oss anta at du ønsker Antall-feltet delt i to – Kjøp og Salg. La oss også anta at du ønsker å ha en fast nullverdi for feltet uten verdi. Slik vil SQL-setningen se ut for denne unionsspørringen:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Hvis du bytter til dataarkvisning, ser du de ti siste postene oppført som følger:
Produkt-ID |
Ordredato |
Firmanavn |
Transaksjon |
Kjøp |
Salg |
74 |
22.01.2006 |
Leverandør B |
Kjøp |
20 |
0 |
77 |
22.01.2006 |
Leverandør B |
Kjøp |
60 |
0 |
80 |
22.01.2006 |
Leverandør D |
Kjøp |
75 |
0 |
81 |
22.01.2006 |
Leverandør A |
Kjøp |
125 |
0 |
81 |
22.01.2006 |
Leverandør A |
Kjøp |
200 |
0 |
7 |
20.01.2006 |
Firma D |
Salg |
0 |
10 |
51 |
20.01.2006 |
Firma D |
Salg |
0 |
10 |
80 |
20.01.2006 |
Firma D |
Salg |
0 |
10 |
34 |
15.01.2006 |
Firma AA |
Salg |
0 |
100 |
80 |
15.01.2006 |
Firma AA |
Salg |
0 |
30 |
Hvis vi fortsetter med dette eksemplet, hva om du ønsker at feltene med null skal være tomme? Du kan endre SQL-setningen slik at den bare viser null ved å legge til Null-nøkkelordet som følger:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Du har nå imidlertid et uventet resultat, som du kanskje la merke til da du byttet til dataarkvisning. I kolonnen Kjøp er innholdet i hvert felt fjernet:
Produkt-ID |
Ordredato |
Firmanavn |
Transaksjon |
Kjøp |
Salg |
74 |
22.01.2006 |
Leverandør B |
Kjøp |
||
77 |
22.01.2006 |
Leverandør B |
Kjøp |
||
80 |
22.01.2006 |
Leverandør D |
Kjøp |
||
81 |
22.01.2006 |
Leverandør A |
Kjøp |
||
81 |
22.01.2006 |
Leverandør A |
Kjøp |
||
7 |
20.01.2006 |
Firma D |
Salg |
10 |
|
51 |
20.01.2006 |
Firma D |
Salg |
10 |
|
80 |
20.01.2006 |
Firma D |
Salg |
10 |
|
34 |
15.01.2006 |
Firma AA |
Salg |
100 |
|
80 |
15.01.2006 |
Firma AA |
Salg |
30 |
Årsaken til dette er at Access fastslår datatypene for feltene fra den første spørringen. I dette eksemplet er ikke Null et tall.
Hva skjer så hvis du prøver å sette inn en tom streng for den tomme verdien i feltene? SQL-setningen for dette forsøket kan se ut som følger:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Når du bytter til dataarkvisning, ser du at Access henter Kjøp-verdiene, men at verdiene ble konvertert til tekst. Du ser at dette er tekstverdier da de er venstrejustert i dataarkvisning. Den tomme strengen i den første spørringen er ikke et tall, og derfor ser du disse resultatene. Du legger også merke til at Salg-verdiene konverteres til tekst, fordi kjøpspostene inneholder en tom streng.
Produkt-ID |
Ordredato |
Firmanavn |
Transaksjon |
Kjøp |
Salg |
74 |
22.01.2006 |
Leverandør B |
Kjøp |
20 |
|
77 |
22.01.2006 |
Leverandør B |
Kjøp |
60 |
|
80 |
22.01.2006 |
Leverandør D |
Kjøp |
75 |
|
81 |
22.01.2006 |
Leverandør A |
Kjøp |
125 |
|
81 |
22.01.2006 |
Leverandør A |
Kjøp |
200 |
|
7 |
20.01.2006 |
Firma D |
Salg |
10 |
|
51 |
20.01.2006 |
Firma D |
Salg |
10 |
|
80 |
20.01.2006 |
Firma D |
Salg |
10 |
|
34 |
15.01.2006 |
Firma AA |
Salg |
100 |
|
80 |
15.01.2006 |
Firma AA |
Salg |
30 |
Hva gjør du for å løse dette?
Én løsning kan være å tvinge spørringen til å forvente at feltverdien skal være et tall. Dette kan oppnås med uttrykket:
IIf(False, 0, Null)
Betingelsen som skal kontrolleres, Usann, blir aldri Sann, og derfor returnerer uttrykket alltid Null. Men Access evaluerer fremdeles begge utdataalternativene og fastslår om utdataene er numerisk eller Null.
Slik kan vi bruke dette uttrykket i vårt fungerende eksempel:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Vær oppmerksom på at du ikke trenger å endre den andre spørringen.
Hvis du bytter til dataarkvisning, ser du nå alternativet vi ønsker:
Produkt-ID |
Ordredato |
Firmanavn |
Transaksjon |
Kjøp |
Salg |
74 |
22.01.2006 |
Leverandør B |
Kjøp |
20 |
|
77 |
22.01.2006 |
Leverandør B |
Kjøp |
60 |
|
80 |
22.01.2006 |
Leverandør D |
Kjøp |
75 |
|
81 |
22.01.2006 |
Leverandør A |
Kjøp |
125 |
|
81 |
22.01.2006 |
Leverandør A |
Kjøp |
200 |
|
7 |
20.01.2006 |
Firma D |
Salg |
10 |
|
51 |
20.01.2006 |
Firma D |
Salg |
10 |
|
80 |
20.01.2006 |
Firma D |
Salg |
10 |
|
34 |
15.01.2006 |
Firma AA |
Salg |
100 |
|
80 |
15.01.2006 |
Firma AA |
Salg |
30 |
En alternativ metode for å oppnå samme resultat er å starte spørringene i unionsspørringen med enda en spørring:
SELECT
0 As [Product ID], Date() As [Order Date],
"" As [Company Name], "" As [Transaction],
0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False
Access returnerer faste verdier for datatypen du definerer, for hvert felt. Du ønsker selvsagt ikke at utdataene i denne spørringen skal samhandle med resultatene, så du bør derfor inkludere en WHERE-setning og angi den til Usann.
WHERE False
Dette er et lite triks siden denne verdien alltid er usann, og spørringen kommer ikke til å returnere noe. Du kombinerer denne setningen med den eksisterende SQL-setningen, og vi får en fullført setning som følger:
SELECT
0 As [Product ID], Date() As [Order Date],
"" As [Company Name], "" As [Transaction],
0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False
UNION
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Obs!: Den kombinerte spørringen i dette eksemplet som bruker Northwind-databasen returnerer 100 poster, mens de to individuelle spørringene returnerer 58 og 43 poster, som blir totalt 101 poster. Årsaken til avviket er at to poster ikke er unike. Du kan se inndelingen Arbeide med unike poster i unionsspørringer ved bruk av UNION ALL for å finne ut hvordan du løser dette scenarioet ved bruk av UNION ALL.
Et spesialtilfelle for en unionsspørring er at du kan kombinere et sett med poster som inneholder summen av ett eller flere felter.
Her ser du et annet eksempel som du kan opprette i eksempeldatabasen for Northwind, for å illustrere hvordan du inkluderer en totalsum i en unionsspørring.
-
Opprett en ny enkel spørring for å vise kjøp av øl (Product ID=34 i Northwind-databasen) ved bruk av følgende SQL-syntaks:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];
-
Bytt til dataarkvisning, og du skal da se fire kjøp:
Dato mottatt
Antall
22.01.2006
100
22.01.2006
60
4.04.2006
50
05.04.2006
300
-
Hvis du ønsker en totalsum, oppretter du en enkel samlespørring ved bruk av følgende SQL-setning:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))
-
Bytt til dataarkvisning, og du skal da se bare én post:
MaxOfDate Received
SumOfQuantity
05.04.2006
510
-
Kombiner disse to postene i en unik unionsspørring for å legge til totalantallet i posten for kjøpspostene.
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) UNION SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];
-
Bytt til dataarkvisning, og du skal se de fire kjøpene med summen for hver, etterfulgt av en post som inneholder totalantallet.
Dato mottatt
Antall
22.01.2006
60
22.01.2006
100
4.04.2006
50
05.04.2006
300
05.04.2006
510
Dette tok for seg det grunnleggende med å legge til summer i en unionsspørring. Du ønsker kanskje også å inkludere faste verdier i begge spørringene som «Detalj» og «totalsum» for å separere totalsum-posten fra de andre postene visuelt. Du kan lese om å bruke faste verdier i inndelingen Kombinere tre eller flere tabeller eller spørringer i en unionsspørring.
Unionsspørringer i Access inneholder bare forskjellige poster som standard. Men hva om du ønsker å inkludere alle postene? Et annet eksempel kan være nyttig.
I den forrige inndelingen lærte du hvordan du opprettet en totalsum i en unionsspørring. Endre SQL-setningen for den unionsspørringen slik at den inkluderer Product ID= 48:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
UNION
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
ORDER BY [Purchase Order Details].[Date Received];
Bytt til dataarkvisning, og du ser da et litt villedende resultat:
Dato mottatt |
Antall |
22.01.2006 |
100 |
22.01.2006 |
200 |
Én post returnerer selvfølgelig ikke to ganger antallet totalt.
Årsaken til at du ser dette resultatet er fordi samme antall sjokolade ble solgt to ganger på samme dag – som du kan se i tabellen Innkjøpsordredetaljer. Her ser du et resultat for en enkel utvalgsspørring som viser begge postene i eksempeldatabasen til Northwind:
Innkjøpsordre-ID |
Product |
Quantity |
100 |
Northwind Traders Chocolate |
100 |
92 |
Northwind Traders Chocolate |
100 |
I unionsspørringen som ble nevnt tidligere kan du se at feltet Innkjøpsordre-ID ikke er inkludert, og at de to feltene ikke utgjør to forskjellige poster.
Hvis du ønsker å inkludere alle postene, bruker du UNION ALL i stedet for UNION i SQL-setningen. Dette kommer sannsynlig bare til å få innvirkning på sorteringen av resultatene, så du kan også inkludere en ORDER BY-setning for å fastslå sorteringsrekkefølgen. Her ser du den endrede SQL-setningen som ble endret fra forrige eksempel:
SELECT [Purchase Order Details].[Date Received], Null As [Total], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
UNION ALL
SELECT Max([Date Received]), "Total" As [Total], Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
ORDER BY [Total];
Bytt til dataarkvisning, og du skal se alle detaljene i tillegg til en totalsum som siste post.
Dato mottatt |
Totalsum |
Antall |
22.01.2006 |
100 |
|
22.01.2006 |
100 |
|
22.01.2006 |
Totalsum |
200 |
Et vanlig brukstilfelle for en unionsspørring er å bruke den som en postkilde for en kombinasjonsbokskontroll i et skjema. Du kan bruke den kombinasjonsboksen til å velge en verdi for å filtrere postene i et skjema. Du kan for eksempel filtrere de ansatte etter bosted.
Hvis du vil se hvordan dette kan fungere, ser du her et annet eksempel som du kan opprette i eksempeldatabasen for Northwind, for å illustrere dette scenarioet.
-
Opprette en enkel utvalgsspørring ved bruk av SQL-syntaks:
SELECT Employees.City, Employees.City AS Filter FROM Employees;
-
Bytt til dataarkvisning, og du skal da se følgende resultater:
Poststed
Filter
Seattle
Seattle
Bellevue
Bellevue
Redmond
Redmond
Kirkland
Kirkland
Seattle
Seattle
Redmond
Redmond
Seattle
Seattle
Redmond
Redmond
Seattle
Seattle
-
Det er ikke sikkert du får mye verdi fra disse resultatene. Utvid spørringen, og transformer den til en unik spørring ved bruk av følgende SQL-setning:
SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;
-
Bytt til dataarkvisning, og du skal da se følgende resultater:
Poststed
Filter
<All>
*
Bellevue
Bellevue
Kirkland
Kirkland
Redmond
Redmond
Seattle
Seattle
Access utfører en unionspørring av de ni postene, som ble vist tidligere, med faste feltverdier <All> og "*".
Siden denne unionsetningen ikke inneholder UNION ALL, returnerer Access bare forskjellige poster. Det betyr at hvert poststed returneres bare én gang med faste identiske verdier.
-
Nå som du har en fullført unionsspørring som viser hvert bynavn bare én gang, sammen med et alternativ som effektivt velger alle byer, kan du bruke denne spørringen som postkilde for en kombinasjonsboks i et skjema. Hvis du bruker dette eksemplet som modell, kan du opprette en kombinasjonsbokskontroll i et skjema, angi denne spørringen som postkilde, angi kolonnebreddeegenskapen for filterkolonnen til 0 (null) for å skjule den visuelt, og deretter angi egenskapen Bundet kolonne til 1 for å angi indeksen for den andre kolonnen. I filteregenskapen for selve skjemaet kan du deretter legge til kode, for eksempel følgende, for å aktivere et skjemafilter ved hjelp av verdien for det som ble valgt i kombinasjonsbokskontrollen:
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
Brukeren av skjemaet kan deretter filtrere skjemapostene etter et spesifikt poststedsnavn, eller velge <All> for å vise alle poster for alle poststedene.