Nogle gange vil du måske kombinere poster fra én tabel eller forespørgsel med poster fra en eller flere andre tabeller til et enkelt resultat. Det er, hvad en foreningsforespørgsel gør i Access.
For effektivt at forstå foreningsforespørgsler skal du først være fortrolig med at designe grundlæggende udvælgelsesforespørgsler i Access. Du kan få mere at vide om, hvordan du designer udvælgelsesforespørgsler under Opret en simpel udvælgelsesforespørgsel.
Gransk et eksempel på en fungerende foreningsforespørgsel
Hvis du aldrig har oprettet en foreningsforespørgsel før, kan det være en hjælp først at undersøge et fungerende eksempel i Northwind Access-skabelonen. Du kan søge efter Northwind-eksempelskabelonen på introduktionssiden i Access ved at vælge Ny fil>. Du kan også downloade en kopi direkte fra Northwind-eksempelskabelonen.
Når Access åbner Northwind-databasen, skal du lukke logondialogboksen, der vises først, og derefter udvide navigationsruden. Vælg toppen af navigationsruden, og vælg derefter Objekttype for at organisere alle databaseobjekter efter type. Udvid derefter gruppen Forespørgsler , og du får vist en forespørgsel med navnet Produkttransaktioner.
Foreningsforespørgsler er lette at skelne fra andre forespørgselsobjekter, fordi de har et specielt ikon, der ligner to sammesnoede cirkler, som står for ét samlet sæt af to forskellige sæt:
I modsætning til almindelige udvælgelses- og handlingsforespørgsler er tabeller ikke relateret i en foreningsforespørgsel. Det betyder, at du ikke kan bruge Access-grafikforespørgselsdesigneren til at opbygge eller redigere foreningsforespørgsler. Hvis du åbner en foreningsforespørgsel fra navigationsruden, åbner Access den og viser resultaterne i dataarkvisning. Under Visninger på fanen Hjem skal du bemærke, at Designvisning ikke er tilgængelig, når du arbejder med foreningsforespørgsler. Du kan kun skifte mellem dataarkvisning og SQL-visning.
Hvis du vil fortsætte din undersøgelse af dette eksempel på en foreningsforespørgsel, skal du klikke på Hjemvisninger>>SQL-visning for at få vist den SQL syntaks, der definerer den. I denne illustration har vi tilføjet lidt ekstra afstand i SQL , så du nemt kan se de forskellige dele, der udgør en foreningsforespørgsel.
Lad os se nærmere på syntaksen SQL for denne foreningsforespørgsel fra Northwind-databasen:
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 del i denne SQL-sætning er i bund og grund to udvælgelsesforespørgsler. Disse forespørgsler henter to forskellige sæt poster: én fra tabellen Produktordrer og én fra tabellen Produktkøb.
Den anden del af denne SQL sætning er nøgleordet UNION , som beder Access om at kombinere disse to sæt poster.
Den sidste del af denne SQL sætning bestemmer rækkefølgen af de kombinerede poster ved hjælp af en ORDER BY sætning. I dette eksempel sorterer Access alle poster efter feltet Ordredato i faldende rækkefølge.
Bemærk
Foreningsforespørgsler er altid skrivebeskyttede i Access. Du kan ikke ændre nogen af værdierne i dataarkvisning.
Opret en foreningsforespørgsel ved at oprette og kombinere udvælgelsesforespørgsler
Selvom du kan oprette en foreningsforespørgsel ved at skrive syntaksen SQL direkte i SQL-visning, kan det være nemmere at opbygge den i dele med udvælgelsesforespørgsler. Du kan derefter kopiere og indsætte SQL-delene i en kombineret foreningsforespørgsel.
Hvis du hellere vil springe læsningen af trinnene over og i stedet se et eksempel, skal du se det næste afsnit Se et eksempel på opbygningen af en foreningsforespørgsel.
- Klik på Forespørgselsdesign i gruppen Forespørgsler under fanen Opret.
- Dobbeltklik på den tabel, der indeholder de felter, du vil medtage. Tabellen føjes til forespørgselsdesignvinduet.
- Dobbeltklik på hvert af de felter, du vil medtage, i forespørgselsdesignvinduet. Når du vælger felter, skal du sørge for at tilføje det samme antal felter i samme rækkefølge, som du føjer til de andre udvælgelsesforespørgsler. Vær opmærksom på datatyperne for felterne, og sørg for, at de har kompatible datatyper med felter på samme placering i de andre forespørgsler, du kombinerer. Hvis din første udvælgelsesforespørgsel f.eks. har fem felter, hvoraf den første indeholder dato-/klokkeslætsdata, skal du sørge for, at hver af de andre udvælgelsesforespørgsler, du kombinerer, også har fem felter, hvoraf den første indeholder dato-/klokkeslætsdata osv.
- Føj evt. kriterier til felterne ved at skrive de rette udtryk i rækken Kriterier i feltgitteret.
- Når du er færdig med at tilføje felter og feltkriterier, skal du køre udvælgelsesforespørgslen og gennemse outputtet. Klik på Kør i gruppen Resultater under fanen Design.
- Skift til forespørgslens designvisning.
- Gem udvælgelsesforespørgslen, og lad den være åben.
- Gentag denne fremgangsmåde for hver af de udvælgelsesforespørgsler, du vil samle.
Nu hvor du har oprettet dine udvælgelsesforespørgsler, er det tid til at kombinere dem. I dette trin skal du oprette foreningsforespørgslen ved at kopiere og indsætte sætningerne SQL .
- Klik på Forespørgselsdesign i gruppen Forespørgsler under fanen Opret.
- Klik på Forening i gruppen Forespørgsel under fanen Design. Access skjuler forespørgselsdesignvinduet og viser objektfanen SQL-visning . På nuværende tidspunkt er fanen tom.
- Klik på fanen for den første udvælgelsesforespørgsel, du vil samle i foreningsforespørgslen.
- Klik på Vis SQL-visning> under fanen Hjem.
- Kopiér sætningen
SQLfor udvælgelsesforespørgslen. Klik på fanen for den foreningsforespørgsel, du startede med at oprette tidligere. - Indsæt sætningen
SQLfor udvælgelsesforespørgslen i objektfanen SQL View i foreningsforespørgslen. - Slet semikolon (
;) i slutningen af udvælgelsesforespørgselssætningenSQL. - Tryk på Enter for at flytte markøren én linje ned, og skriv
UNIONderefter på den nye linje. - Klik på fanen for den næste udvælgelsesforespørgsel, du vil samle i foreningsforespørgslen.
- Gentag trin 5 til 10, indtil du har kopieret og indsat alle sætningerne
SQLfor udvælgelsesforespørgslerne i vinduet SQL-visning for foreningsforespørgslen. Slet ikke semikolonet, eller skriv ikke noget efter sætningenSQLfor den sidste udvælgelsesforespørgsel. - Klik på Kør i gruppen Resultater under fanen Design.
Resultaterne af foreningsforespørgslen vises i Dataarkvisning.
Se et eksempel på, hvordan du opretter en foreningsforespørgsel
Her er et eksempel, som du kan genskabe i Northwind-eksempeldatabasen. Denne foreningsforespørgsel indsamler navnene på personer fra tabellen Kunder og kombinerer dem med navnene på personer fra tabellen Leverandører. Du kan følge med ved at udføre disse trin i din kopi af Northwind-eksempeldatabasen.
Du skal udføre følgende trin for at oprette dette eksempel:
Opret to udvælgelsesforespørgsler kaldet Forespørgsel1 og Forespørgsel2 med tabellerne Kunder og Leverandører som datakilder. Brug felterne Fornavn og Efternavn som visningsværdier.
Opret en ny forespørgsel kaldet Forespørgsel3 indledningsvist uden værdi, og klik derefter på kommandoen Forening på fanen Design for at gøre denne forespørgsel til en foreningsforespørgsel.
Kopiér og indsæt SQL-sætningerne fra Forespørgsel1 og Forespørgsel2 i Forespørgsel3. Sørg for at fjerne det ekstra semikolon og tilføje nøgleordet
UNION. Du kan derefter se resultaterne i dataarkvisning.Føj en sorteringsdelsætning til en af forespørgslerne, og indsæt derefter sætningen
ORDER BYi foreningsforespørgslen i SQL-visning. Bemærk, at i Forespørgsel3 (foreningsforespørgslen), mens tilføjelsen af rækkefølgen er ved at blive udført, fjernes semikolonerne først, og fjernes derefter tabelnavnene fra feltnavnene.Det sidste
SQL, der kombinerer og sorterer navnene for dette eksempel på en foreningsforespørgsel, 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 meget fortrolig med at skrive SQL syntaks, kan du skrive din egen SQL sætning til foreningsforespørgslen direkte i SQL-visning. Men det kan være nyttigt at følge fremgangsmåden med at kopiere og indsætte SQL fra andre forespørgselsobjekter. Hver forespørgsel kan være meget mere kompliceret, end de simple eksempler på udvælgelsesforespørgsler der er brugt her. Du kan drage fordel af nøje at oprette og teste hver forespørgsel, før de kombineres i foreningsforespørgslen. Hvis kørslen af foreningsforespørgslen mislykkes, kan du justere hver forespørgsel enkeltvist, indtil det lykkes, og derefter genopbygge din foreningsforespørgsel med den rettede syntaks.
Gennemse de øvrige afsnit i denne artikel for at få flere tips og tricks til brugen af foreningsforespørgsler.
Kombiner tre eller flere tabeller eller forespørgsler i en foreningsforespørgsel
I eksemplet fra forrige afsnit, der bruger Northwind-databasen, kombineres data fra kun to tabeller. Du kan dog nemt kombinere tre eller flere tabeller i en foreningsforespørgsel. Hvis du f.eks. bygger videre på det forrige eksempel, vil du måske også medtage navnene på medarbejderne i forespørgselsresultatet. Du kan udføre denne opgave ved at tilføje en tredje forespørgsel og kombinere med den forrige SQL-sætning med et ekstra UNION-nøgleord 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 får vist resultatet i dataarkvisning, vises alle medarbejdere med eksempelfirmaets navn, hvilket sandsynligvis ikke er særlig nyttigt. Hvis du vil have feltet til at vise, om en person er en medarbejder internt, fra en leverandør eller fra en kunde, kan du medtage en fast værdi i stedet for firmanavnet. Sådan ser det SQL ud:
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];
Sådan ser resultatet ud i dataarkvisningen. Access viser disse fem eksempelposter:
| Ansættelse | Efternavn | Fornavn |
|---|---|---|
| Intern | Freehafer | Nancy |
| Intern | Giussani | Laura |
| Leverandør | Glasson | Stuart |
| Kunde | Goldschmidt | Daniel |
| Kunde | Gratacos Solsona | Antonio |
Du kan reducere forespørgslen endnu mere, fordi Access kun læser navnene på outputfelterne fra den første forespørgsel i en foreningsforespørgsel. Her fjernes outputtet fra den anden og tredje forespørgselssektion:
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 foreningsforespørgsler
I en Access-foreningsforespørgsel er sortering kun tilladt én gang, men du kan filtrere hver forespørgsel enkeltvis. På baggrund af forrige afsnits foreningsforespørgsel er her et eksempel, der filtrerer hver forespørgsel ved at tilføje en WHERE delsætning.
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];
Skift til dataarkvisning for at få vist resultater, der ser ud som herunder:
| Ansættelse | Efternavn | Fornavn |
|---|---|---|
| Leverandør | Andersen | Elizabeth A. |
| Intern | Freehafer | Nancy |
| Kunde | Hasselberg | Jonas |
| Intern | Hellung-Larsen | Anne |
| Leverandør | Hernandez-Echevarria | Amaya |
| Kunde | Mortensen | Sven |
| Leverandør | Sandberg | Mikael |
| Leverandør | Sousa | Luis |
| Intern | Thorpe | Steven |
| Leverandør | Weiler | Cornelia |
| Intern | Zare | Robert |
Blanding af datatyper
Hvis de forespørgsler, du sammenkæder, er meget forskellige, kan der opstå en situation, hvor et outputfelt skal kombinere data med forskellige datatyper. Hvis dette er tilfældet, så vil foreningsforespørgslen som oftest returnere resultaterne som en tekstdatatype, idet denne datatype kan indeholde både tekst og tal.
For at forstå, hvordan dette fungerer, så bruger vi foreningsforespørgslen Produkttransaktioner i Northwind-eksempeldatabasen. Åbn eksempeldatabasen, og åbn derefter forespørgslen Produkttransaktioner i dataarkvisning. De seneste ti poster bør svare til dette output:
| Produkt-id | Ordredato | Firmanavn | Transaktion | Antal |
|---|---|---|---|---|
| 77 | 22-01-2006 | Leverandør B | Køb | 60 |
| 80 | 22-01-2006 | Leverandør D | Køb | 75 |
| 81 | 22-01-2006 | Leverandør A | Køb | 125 |
| 81 | 22-01-2006 | Leverandør A | Køb | 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 |
Lad os antage, at du vil opdele feltet Antal i to felter: Køb og Sælg. Lad os også antage, at du vil have en fast nulværdi for feltet uden nogen værdi. Sådan ser det SQL ud for denne foreningsforespørgsel:
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 skifter til dataarkvisning, får du vist de sidste ti poster nu, som vist herunder:
| Produkt-id | Ordredato | Firmanavn | Transaktion | Køb | Sælg |
|---|---|---|---|---|---|
| 74 | 22-01-2006 | Leverandør B | Køb | 20 | 0 |
| 77 | 22-01-2006 | Leverandør B | Køb | 60 | 0 |
| 80 | 22-01-2006 | Leverandør D | Køb | 75 | 0 |
| 81 | 22-01-2006 | Leverandør A | Køb | 125 | 0 |
| 81 | 22-01-2006 | Leverandør A | Køb | 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 |
I forlængelse af dette eksempel, hvad nu, hvis du vil have, at felter med nulværdier skal være tomme? Du kan ændre , så der SQL ikke vises noget i stedet for nul, ved at tilføje nøgleordet Null , sådan som det er 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;
Men, som du måske har oplevet ved at skifte til dataarkvisning, så får du nu et uventet resultat. I kolonnen Køb er alle felter blevet ryddet:
| Produkt-id | Ordredato | Firmanavn | Transaktion | Køb | Sælg |
|---|---|---|---|---|---|
| 74 | 22-01-2006 | Leverandør B | Køb | ||
| 77 | 22-01-2006 | Leverandør B | Køb | ||
| 80 | 22-01-2006 | Leverandør D | Køb | ||
| 81 | 22-01-2006 | Leverandør A | Køb | ||
| 81 | 22-01-2006 | Leverandør A | Køb | ||
| 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 |
Dette skyldes, at Access fastlægger datatyperne for felterne fra den første forespørgsel. I dette eksempel er Null ikke et tal.
Så hvad sker der, hvis du forsøger at indsætte en tom streng for felternes tomme værdi? For SQL dette forsøg kan se sådan ud:
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 skifter til dataarkvisning, kan du se, at Access henter værdierne for Køb, men har konverteret værdierne til tekst. Du kan se, at det er tekstværdier, fordi de er venstrejusteret i dataarkvisningen. En tom streng i den første forespørgsel er ikke et tal, hvilket er grunden til, at du kan se de pågældende resultater. Du vil også bemærke, at Sælg-værdierne er konverteret til tekst, fordi posterne for køb indeholder en tom streng.
| Produkt-id | Ordredato | Firmanavn | Transaktion | Køb | Sælg |
|---|---|---|---|---|---|
| 74 | 22-01-2006 | Leverandør B | Køb | 20 | |
| 77 | 22-01-2006 | Leverandør B | Køb | 60 | |
| 80 | 22-01-2006 | Leverandør D | Køb | 75 | |
| 81 | 22-01-2006 | Leverandør A | Køb | 125 | |
| 81 | 22-01-2006 | Leverandør A | Køb | 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 |
Hvordan kan du løse dette problem?
En løsning er at tvinge forespørgslen til at forvente, at feltværdien er et tal. Det kan du gøre med dette udtryk:
IIf(False, 0, Null)
Betingelsen for at kontrollere, Falseer aldrig True, så udtrykket altid returnerer Null. Access evaluerer dog stadig begge outputindstillinger og behandler outputtet som numerisk eller Null.
Vi kan bruge dette udtryk på følgende måde i vores 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 behøver ikke at ændre den anden forespørgsel.
Hvis du skifter til dataarkvisning, får du nu vist et korrekt resultat:
| Produkt-id | Ordredato | Firmanavn | Transaktion | Køb | Sælg |
|---|---|---|---|---|---|
| 74 | 22-01-2006 | Leverandør B | Køb | 20 | |
| 77 | 22-01-2006 | Leverandør B | Køb | 60 | |
| 80 | 22-01-2006 | Leverandør D | Køb | 75 | |
| 81 | 22-01-2006 | Leverandør A | Køb | 125 | |
| 81 | 22-01-2006 | Leverandør A | Køb | 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 |
Du kan også opnå det samme resultat ved at benytte en metode, hvor du foranstiller forespørgslerne i foreningsforespørgslen med endnu en forespørgsel:
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
For hvert felt returnerer Access faste værdier af datatypen, du definerer. Du vil selvfølgelig ikke have, at outputtet fra denne forespørgsel indvirker på resultaterne, så derfor skal du føje en WHERE-delsætning til Falsk:
WHERE False
Dette er et lille trick. Da betingelsen altid er falsk, returnerer forespørgslen ikke noget. Når denne sætning kombineres med den eksisterende SQL, så ender vi med den følgende fuldførte sætning:
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;
Bemærk
I dette eksempel returnerer den kombinerede forespørgsel i Northwind-databasen 100 poster, mens de to individuelle forespørgsler returnerer 58 og 43 poster i alt 101 poster. Denne forskel sker, fordi to poster ikke er entydige. Se Arbejde med særskilte poster i foreningsforespørgsler ved hjælp af UNION ALL for at få mere at vide om, hvordan du løser dette scenarie ved hjælp UNION ALLaf .
Tilføjelse af totaler i en foreningsforespørgsel
En særlig brug af en foreningsforespørgsel er at kombinere et sæt poster med én post, der indeholder summen af et eller flere felter.
Her er et andet eksempel, som du kan oprette i Northwind-eksempeldatabasen til illustration af, hvordan du får en totalværdi i en foreningsforespørgsel.
Opret en ny simpel forespørgsel for at få vist indkøb af øl (Produkt-id=34 i Northwind-databasen) ved hjælp af 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];Når du skifter til dataarkvisning, bør du se fire køb:
Modtaget d. Antal 22-01-2006 100 22-01-2006 60 04-04-2006 50 05-04-2006 300 For at få totalen skal du oprette en simpel aggregeringsforespørgsel ved at bruge den følgende SQL:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))Når du skifter til dataarkvisning, bør du kun se én post:
MaxOfDate modtaget SumOfQuantity 05-04-2006 510 Kombiner disse to forespørgsler i en foreningsforespørgsel for at føje posten med den totale mængde til posterne for køb:
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];Hvis du skifter til dataarkvisning, bør du se de fire køb med summen for hver efterfulgt af en post, der lægger den samlede mængde sammen:
Modtaget d. Antal 22-01-2006 60 22-01-2006 100 04-04-2006 50 05-04-2006 300 05-04-2006 510
Det dækker det grundlæggende om at føje totaler til en foreningsforespørgsel. Du kan også medtage faste værdier i begge forespørgsler, f.eks. "Detaljer" og "Total", for visuelt at adskille totalposten fra de andre poster. Du kan gennemse ved hjælp af faste værdier i afsnittet Kombiner tre eller flere tabeller eller forespørgsler i en foreningsforespørgsel.
Arbejd med særskilte poster i foreningsforespørgsler ved hjælp af UNION ALL
Foreningsforespørgsler i Access inkluderer som standard kun særskilte poster. Men hvad nu, hvis du vil inkludere alle poster? Et andet eksempel kan være nyttigt her.
I det forrige afsnit viste vi, hvordan du opretter en total i en foreningsforespørgsel. Rediger foreningsforespørgslen SQL , så den indeholder 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];
Når du skifter til dataarkvisning, bør du se et noget misvisende resultat:
| Modtaget d. | Antal |
|---|---|
| 22-01-2006 | 100 |
| 22-01-2006 | 200 |
Selvfølgelig returnerer én post ikke det dobbelte af det samlede antal.
Du får vist dette resultat, fordi den samme mængde chokolade blev solgt to gange på en dag, som registreret i tabellen Indkøbsordredetaljer. Her er en simpel udvælgelsesforespørgsel, der viser begge poster i Northwind-eksempeldatabasen:
| Indkøbsordre-id | Produkt | Antal |
|---|---|---|
| 100 | Northwind Traders Chocolate | 100 |
| 92 | Northwind Traders Chocolate | 100 |
I foreningsforespørgslen tidligere kan du se, at feltet Indkøbsordre-id ikke er inkluderet, og at de to felter ikke udgør to særskilte poster.
Hvis du vil medtage alle poster, skal du bruge UNION ALL i stedet for UNION i din SQL. Dette vil højst sandsynligt påvirke sorteringen af resultaterne, så du kan også medtage en ORDER BY delsætning for at bestemme en sorteringsrækkefølge. Her er den ændrede SQL baseret på det 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];
Når du skifter til dataarkvisning, bør du se alle oplysningerne ud over en total som den sidste post:
| Modtaget d. | Total | Antal |
|---|---|---|
| 22-01-2006 | 100 | |
| 22-01-2006 | 100 | |
| 22-01-2006 | Total | 200 |
Brug en foreningsforespørgsel til at filtrere poster i en formular via et kombinationsfeltelement
En foreningsforespørgsel bruges almindeligvis som postkilden i et kombinationsfeltelement i en formular. Du kan bruge dette kombinationsfelt til at vælge en værdi beregnet til at filtrere formularens poster. Eksempelvis for at filtrere medarbejderposterne efter deres by.
Du kan se, hvordan dette kan fungere med endnu et eksempel, som du kan oprette i Northwind-eksempeldatabasen for at illustrere dette scenarie.
Opret en simpel udvælgelsesforespørgsel ved hjælp af denne
SQLsyntaks:SELECT Employees.City, Employees.City AS Filter FROM Employees;Skift til dataarkvisning, og så bør du kunne se de følgende resultater:
By Filter Seattle Seattle Bellevue Bellevue Redmond Redmond Kirkland Kirkland Seattle Seattle Redmond Redmond Seattle Seattle Redmond Redmond Seattle Seattle Resultaterne viser nok ikke meget af værdi. Men udvid forespørgslen, og gør den til en foreningsforespørgsel ved hjælp af følgende
SQL:SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;Skift til dataarkvisning, og så bør du kunne se de følgende resultater:
By Filter <Alle> * Bellevue Bellevue Kirkland Kirkland Redmond Redmond Seattle Seattle Access udfører en forening af de ni poster, der tidligere blev vist, med faste feltværdier for <Alle> og "*". Da denne foreningssætning ikke indeholder
UNION ALL, returnerer Access kun særskilte poster. Det betyder, at hver by kun returneres én gang med faste identiske værdier.Nu hvor du har fuldført en foreningsforespørgsel, hvor hvert bynavn kun vises én gang sammen med en indstilling, der effektivt vælger alle byer, kan du bruge denne forespørgsel som postkilde for et kombinationsfelt på en formular. Du kan bruge dette specifikke eksempel som en model til at oprette et kombinationsfeltelement på en formular, angive denne forespørgsel som dets postkilde, angive egenskaben Kolonnebredde på filterkolonnen til 0 (nul) for at skjule den visuelt og derefter angive bundkolonnens egenskab til 1 for at vise indekset for den anden kolonne. I egenskaben
Filterfor selve formularen kan du derefter tilføje kode som følgende for at aktivere et formularfilter ved hjælp af den værdi, der er valgt i kombinationsfeltkontrolelementet:Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = TrueBrugeren af formularen kan derefter filtrere formularposterne til et bestemt bynavn eller vælge <Alle> for at få vist alle poster for alle byer.