Noen ganger vil du kanskje kombinere poster fra én tabell eller spørring med poster fra én eller flere andre tabeller til ett enkelt resultat. Det er det en unionsspørring gjør 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 aldri har opprettet en unionsspørring før, kan det hjelpe å først studere et fungerende eksempel i Northwind Access-malen. Du kan søke etter eksempelmalen Gastronor på komme i gang-siden i Access ved å velge Ny fil>. Du kan også laste ned en kopi direkte fra eksempelmalen Northwind.
Når Access åpner Northwind-databasen, lukker du dialogboksen for pålogging som først vises, og deretter utvider du navigasjonsruten. Velg toppen av navigasjonsruten, og velg deretter Objekttype for å organisere alle databaseobjekter 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 ikke tabeller relatert i en unionsspørring. Det betyr at du ikke kan bruke spørringsutforming for Access-grafikk til å bygge eller redigere unionsspørringer. Hvis du åpner en unionsspørring fra navigasjonsruten, åpner Access den og viser resultatene i dataarkvisning. Legg merke til at utformingsvisning ikke er tilgjengelig når du arbeider med unionsspørringer, under Visninger på Hjem-fanen. Du kan bare bytte mellom dataarkvisning og SQL-visning.
Hvis du vil fortsette studiet av dette unionsspørringseksemplet, klikker duSQL-visningforhjemvisninger>> for å vise syntaksen SQL som definerer den. I denne illustrasjonen har vi lagt til litt ekstra avstand, SQL slik at du enkelt kan se de ulike delene som utgjør en unionsspørring.
La oss se på syntaksen SQL for 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 ber Access kombinere disse to settene med poster.
Den siste delen av denne SQL setningen bestemmer rekkefølgen på de kombinerte postene ved hjelp av en ORDER BY setning. I dette eksemplet bestiller Access alle poster 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 syntaksen SQL direkte i SQL-visning, kan det være enklere å bygge den i deler med 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å som du har opprettet utvalgsspørringene, er det på tide å kombinere dem. I dette trinnet oppretter du unionsspørringen ved å kopiere og lime inn SQL setningene.
- I fanen Opprett i gruppen Spørringer, klikker du på Spørreutforming.
- Klikk på Union i Spørring-gruppen på Utforming-fanen. Access skjuler spørringsutformingsvinduet og viser objektfanen SQL-visning . Nå er fanen tom.
- Klikk på fanen for den første utvalgsspørringen du vil kombinere i unionsspørringen.
- Klikk Vis>SQL-visning på Hjem-fanen.
- Kopier setningen
SQLfor utvalgsspørringen. Klikk på fanen for unionsspørringen som du begynte å opprette tidligere. - Lim inn setningen
SQLfor utvalgsspørringen i objektfanen SQL View i unionsspørringen. - Slett semikolonet (
;) på slutten av utvalgsspørringssetningenSQL. - Trykk enter for å flytte markøren ned én linje, og skriv deretter inn
UNIONpå 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
SQLsetningene for utvalgsspørringene i SQL View-vinduet i unionsspørringen. Ikke slett semikolonet, eller skriv inn noe etterSQLsetningen for den siste utvalgsspø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 er et eksempel som du kan opprette på nytt i eksempeldatabasen Gastronor. 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. Pass på å fjerne det ekstra semikolonet og legge til nøkkelordet
UNION. Du kan deretter se resultatene i dataarkvisningen.Legg til en ordresetning i én av spørringene, og lim
ORDER BYderetter inn setningen i unionsspørringen i SQL-visning. Vær oppmerksom på følgende: når ordren endres i Spørring3, unionsspørringen, fjernes først semikolonet og deretter tabellnavnet fra feltnavnene.SQLFinalen som kombinerer og sorterer navnene for dette unionsspørringseksemplet, 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 er svært komfortabel med å skrive SQL syntaks, kan du skrive din egen SQL setning for unionsspørringen direkte i SQL View. 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.
Kombinere tre eller flere tabeller eller spørringer i en unionsspørring
I eksemplet fra forrige del som bruker Northwind-databasen, kombineres data fra bare to tabeller. 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 vise 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 ser det SQL 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 |
Du kan redusere spørringen ytterligere fordi Access leser navnene på utdatafeltene bare fra den første spørringen i en unionsspørring. Her fjernes utdataene fra andre og tredje spørringsinndelinger:
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];
Filtrering i unionsspørringer
I en unionsspørring i Access er sortering bare tillatt én gang, men du kan filtrere hver spørring enkeltvis. Her er et eksempel som filtrerer 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 |
Blande datatyper
Hvis spørringene du fagforeninger er svært forskjellige, kan det oppstå 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 vil dele Antall-feltet i to felt: Kjøp og Salg. La oss også anta at du vil ha en fast nullverdi for feltet uten verdi. Slik ser det SQL 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 du fortsetter med dette eksemplet, hva om du vil at feltene med nullverdier skal være tomme? Du kan endre SQL til å vise ingenting i stedet for null ved å legge til Null nøkkelordet, som vist her:
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.
Så hva skjer hvis du prøver å sette inn en tom streng for den tomme verdien i feltene? For SQL dette forsøket kan det se slik ut:
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 er å tvinge spørringen til å forvente at feltverdien skal være et tall. Du kan gjøre dette med dette uttrykket:
IIf(False, 0, Null)
Betingelsen som skal kontrolleres, Falseer aldri True, så uttrykket returnerer Nullalltid . Access evaluerer imidlertid fortsatt både utdataalternativer og behandler utdataene som numeriske 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;
Du trenger ikke å 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. Fordi betingelsen alltid er usann, returnerer ikke spørringen 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!
I dette eksemplet returnerer den kombinerte spørringen i Northwind-databasen 100 poster, mens de to individuelle spørringene returnerer 58 og 43 poster for totalt 101 poster. Denne forskjellen skjer fordi to poster ikke er unike. Se Arbeide med distinkte poster i unionsspørringer ved hjelp av UNION ALL for å lære hvordan du løser dette scenarioet ved hjelp UNION ALLav .
Legge til totalsummer i en unionsspørring
En spesiell bruk for en unionsspørring er å kombinere et sett med poster med én post som inneholder summen av ett eller flere felt.
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 vil kanskje også inkludere faste verdier i begge spørringene, for eksempel «Detalj» og «Total» for å skille totalposten visuelt fra de andre postene. Du kan lese om å bruke faste verdier i inndelingen Kombinere tre eller flere tabeller eller spørringer i en unionsspørring.
Arbeide med unike poster i unionsspørringer ved bruk av UNION ALL
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 unionsspørringen slik at den SQL 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 selvsagt ikke det dobbelte av det totale antallet.
Du ser dette resultatet fordi den samme mengden sjokolade ble solgt to ganger på én dag, som registrert i tabellen Kjøpsordredetaljer. Her ser du et resultat for en enkel utvalgsspørring som viser begge postene i eksempeldatabasen til Northwind:
| Innkjøpsordre-ID | Produkt | Quantity |
|---|---|---|
| 100 | Northwind Traders Chocolate | 100 |
| 92 | Northwind Traders Chocolate | 100 |
I unionsspørringen som er angitt tidligere, kan du se at feltet Kjøpsordre-ID ikke er inkludert, og at de to feltene ikke utgjør to distinkte poster.
Hvis du vil inkludere alle postene, bruker UNION ALL du i stedet UNION for i SQL. Dette vil mest sannsynlig påvirke sorteringen av resultatene, så du vil kanskje også inkludere en ORDER BY setning for å bestemme en sorteringsrekkefølge. Her er endret basert på det forrige eksemplet SQL :
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 |
Bruke en unionsspørring for å filtrere poster i et skjema ved bruk av en kombinasjonsbokskontroll
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.
Opprett en enkel utvalgsspørring ved hjelp av denne
SQLsyntaksen: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 gjør den om til en unionsspørring ved hjelp av følgende
SQL: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 <Alle> * Bellevue Bellevue Kirkland Kirkland Redmond Redmond Seattle Seattle Access utfører en sammensluting av de ni postene, som tidligere ble vist, med faste feltverdier for <Alle> og «*». Fordi denne unionssetningen ikke inneholder
UNION ALL, returnerer Access bare distinkte poster. Det betyr at hver by 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.
FilterI egenskapen for selve skjemaet kan du deretter legge til kode som følgende for å aktivere et skjemafilter ved hjelp av verdien som er valgt i kombinasjonsbokskontrollen:Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = TrueBrukeren av skjemaet kan deretter filtrere skjemapostene til et bestemt bynavn eller velge <Alle> for å vise alle postene for alle byer.