Ibland kanske du vill visa poster från en tabell eller fråga tillsammans med poster från en eller flera andra tabeller och skapa en uppsättning poster – en lista med alla poster från två eller flera tabeller. Det gör du med en unionsfråga i Access.
För att verkligen förstå unionsfrågor bör du först veta hur du skapar grundläggande urvalsfrågor i Access. Mer information om hur du utformar urvalsfrågor finns i Skapa en enkel urvalsfråga.
Se ett exempel på hur en unionsfråga fungerar
Om du aldrig har skapat en unionsfråga tidigare kan det vara användbart att först se ett exempel på hur det kan fungera i Access-mallen för Northwind. Du kan söka efter Northwind-exempelmallen på sidan Komma igång med Access genom att klicka på Arkiv > Nytt eller så kan du ladda ned en kopia direkt här: Northwind-exempelmall.
När Northwind-databasen öppnas i Access stänger du formuläret för inloggningsdialogrutan som först visas och expanderar sedan navigeringsfönstret. Klicka högst upp i navigeringsfönstret och välj sedan Objekttyp för att ordna alla databasobjekt efter typ. Expandera sedan gruppen Frågor så visas en fråga som heter Produkttransaktioner.
Det är enkelt att skilja unionsfrågor från andra frågeobjekt eftersom de har en särskild ikon som liknar två sammanflätade cirklar som representerar en förenad uppsättning av två uppsättningar:
Till skillnad från vanliga urvals- och redigeringsfrågor är tabeller inte relaterade i en unionsfråga, vilket innebär att Den grafiska frågedesignern i Access inte kan användas för att skapa eller redigera unionsfrågor. Det här händer om du öppnar en unionsfråga från navigeringsfönstret. Access öppnar den och visar resultatet i databladsvyn. Under kommandot Vyer på fliken Start ser du att designvyn inte är tillgänglig när du arbetar med unionsfrågor. Du kan bara växla mellan databladsvyn och SQL-vyn när du arbetar med unionsfrågor.
Om du vill fortsätta att utforska det här exemplet på unionsfråga klickar du på Start > Vyer > SQL-vy för att visa SQL-syntaxen som definierar den. I den här illustrationen har vi lagt till några extra mellanrum i SQL-vyn så att du enkelt kan se de olika delarna som utgör en unionsfråga.
Nu ska vi titta på SQL-syntaxen i den här unionsfrågan från 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örsta och tredje delen av det här SQL-uttrycket är i princip två urvalsfrågor. Dessa frågor hämtar två olika uppsättningar poster: en från tabellen Produktorder och en från tabellen Produktinköp.
Den andra delen av det här SQL-uttrycket är nyckelordet UNION, som anger i Access att den här frågan kombinerar dessa två uppsättningar poster.
Den sista delen av det här SQL-uttrycket avgör ordningen för de kombinerade posterna med hjälp av ett ORDER BY-uttryck. I det här exemplet ordnar Access alla poster efter fältet Orderdatum i fallande ordning.
Obs!: Unionsfrågor är alltid skrivskyddade i Access. Du kan inte ändra några värden i databladsvyn.
Skapa en unionsfråga genom att skapa och kombinera urvalsfrågor
Även om du kan skapa en unionsfråga genom att direkt skriva SQL-syntaxen i SQL-vyn, kan det vara enklare att skapa den i delar med urvalsfrågor. Du kan sedan kopiera och klistra in SQL-delarna i en kombinerad unionsfråga.
Om du inte vill läsa anvisningarna och i stället titta på ett exempel kan du gå till nästa avsnitt, Se ett exempel på att skapa en unionsfråga.
-
Klicka på Frågedesign i gruppen Frågor på fliken Skapa.
-
Dubbelklicka på tabellen som innehåller de fält som du vill ta med. Tabellen läggs till i frågedesignfönstret.
-
Dubbelklicka på varje fält som du vill ta med i frågedesignfönstret. När du markerar fälten ska du se till att lägga till samma antal fält, i samma ordning, som du lägger till andra urvalsfrågor. Var uppmärksam på fältens datatyper och kontrollera att de har datatyper som är kompatibla med fält i samma position i de övriga frågorna du kombinerar. Om den första markerade frågan exempelvis har fem fält där den första innehåller datum-/tidsdata, ska du säkerställa att var och en av de övriga frågorna du kombinerar också har fem fält, där den första innehåller datum-/tidsdata osv.
-
Du kan även lägga till villkor för fälten genom att skriva in lämpliga uttryck på raden för Villkor i rutnätet.
-
När du har lagt till fält och fältvillkor bör du köra urvalsfrågan och granska dess utdata. Gå till fliken Design, gruppen Resultat och klicka på Kör.
-
Växla frågan till designvyn.
-
Spara Select-frågan och lämna den öppen.
-
Upprepa den här proceduren för var och en av de Select-frågor du vill kombinera.
Nu när du har skapat dina urvalsfrågor är det dags att kombinera dem. I det här steget skapar du unionsfrågan genom att kopiera och klistra in SQL-uttryck.
-
Klicka på Frågedesign i gruppen Frågor på fliken Skapa.
-
Gå till fliken Design, gruppen Fråga och klicka på Union. Access döljer frågedesignfönstret och visar SQL-vyns objektflik. I det här läget är SQL-vyns objektflik tom.
-
Klicka på fliken för den första Select-frågan du vill kombinera i unionsfrågan.
-
Gå till fliken Start och klicka på Visa > SQL-vy.
-
Kopiera SQL-uttrycket för Select-frågan. Klicka på fliken för unionsfrågan som du började skapa tidigare.
-
Klistra in SQL-uttrycket för Select-frågan på unionsfrågans objektflik för SQL-vyn.
-
Ta bort semikolonet (;) som ligger i slutet av Select-frågans SQL-uttryck.
-
Tryck på Retur för att flytta ned markören en rad och skriv sedan UNION på den nya raden.
-
Klicka på fliken för nästa Select-fråga som du vill kombinera i unionsfrågan.
-
Upprepa steg 5 till 10 för den här proceduren tills du har kopierat och klistrat in alla SQL-uttryck för Select-frågor i SQL-vyn för unionsfrågan. Ta inte bort semikolon eller skriv något efter SQL-uttrycket för den senaste Select-frågan.
-
Klicka på Kör i gruppen Resultat på fliken Design.
Resultaten av unionsfrågan visas i databladsvyn.
Se ett exempel på att skapa en unionsfråga
Här är ett exempel som du kan återskapa i Northwind-exempeldatabasen. Den här unionsfrågan samlar in namnen på personer från tabellen Kunder och kombinerar dem med namnen på personer från tabellen Leverantörer. Om du vill följa med själv kan du gå igenom stegen i ditt exemplar av Northwind-exempeldatabasen.
De här stegen är nödvändiga för att skapa det här exemplet:
-
Skapa två urvalsfrågor som kallas Fråga1 och Fråga2 med tabellerna Kunder respektive Leverantörer som datakällor. Använd fälten Förnamn och Efternamn som visningsvärden.
-
Skapa en ny fråga som kallas Fråga3 utan datakälla till en början och klicka sedan på kommandot Union på fliken Design för att göra den här frågan till en unionsfråga.
-
Kopiera och klistra in SQL-uttrycken från Fråga1 och Fråga2 till Fråga3. Se till att ta bort det extra semikolonet och lägg till nyckelordet UNION. Du kan sedan kontrollera resultaten i databladsvyn.
-
Lägg till en ordningssats i någon av frågorna och klistra sedan in ORDER BY-uttrycket i unionsfrågans SQL-vy. Lägg märke till följande i Fråga3, unionsfrågan: När ordningen håller på att läggas till tas först semikolonen bort, och sedan tabellnamnet från fältnamnen.
-
Den slutliga SQL-syntaxen som kombinerar och sorterar namnen för det här exemplet på en unionsfråga är följande:
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];
Om du är helt bekväm med att skriva SQL-syntax kan du skriva ett eget SQL-uttryck för unionsfrågan direkt i SQL-vyn. Men kan det vara användbart att följa metoden att kopiera och klistra in SQL från andra frågeobjekt. Varje fråga kan vara mycket mer komplicerad än de enkla urvalsfrågeexempel som används här. Det kan vara bra att skapa och testa varje fråga noggrant innan du kombinerar dem i en unionsfråga. Om unionsfrågan inte kan köras kan du justera varje fråga individuellt tills det går och sedan återskapa din unionsfråga med den korrigerade syntaxen.
Läs de återstående avsnitten i den här artikeln om du vill ha fler tips om hur du använder unionsfrågor.
I exemplet i det föregående avsnittet med Northwind-databasen kombineras bara data från två tabeller. Du kan dock enkelt kombinera tre eller fler tabeller i en unionsfråga. Till exempel kanske du vill bygga vidare på föregående exempel och även inkludera namnen på de anställda i frågeresultatet. Du kan utföra uppgiften genom att lägga till en tredje fråga och kombinera med det föregående SQL-uttrycket med ett ytterligare UNION-nyckelord så här:
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 visar resultatet i databladsvyn visas alla anställda med exempelföretagsnamnet, vilket förmodligen inte är så användbart. Om du vill att fältet ska ange om en person är en intern anställd, från en leverantör eller från en kund kan du inkludera ett fast värde i stället för företagsnamnet. Så här bör SQL-syntaxen 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];
Så här visas resultatet i vyn Datablad. Access visar följande fem exempelposter:
Anställning |
Efternamn |
Förnamn |
Interna |
Freehafer |
Nancy |
Interna |
Giussani |
Laura |
Leverantör |
Glasson |
Stuart |
Kund |
Goldschmidt |
Daniel |
Kund |
Gratacos Solsona |
Antonio |
Frågan ovan kan reduceras ytterligare eftersom Access bara läser namnen i utdatafälten för den första frågan i en unionsfråga. Här ser du att vi har tagit bort utdata från det andra och tredje frågeavsnittet:
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];
Ordningen kan endast ändras en gång i en unionsfråga i Access men varje fråga kan filtreras individuellt. Med utgångspunkt i föregående avsnitts unionsfråga visas här är ett exempel där vi har filtrerat varje fråga genom att lägga till en WHERE-sats.
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];
Växla till databladsvyn så visas resultatet ungefär så här:
Anställning |
Efternamn |
Förnamn |
Leverantör |
Andersen |
Elizabeth A. |
Interna |
Freehafer |
Nancy |
Kund |
Hasselberg |
Jonas |
Interna |
Hellung-Larsen |
Anne |
Leverantör |
Hernandez Echevarria |
Amaya |
Kund |
Mortensen |
Sven |
Leverantör |
Sandberg |
Mikael |
Leverantör |
Sabzevari |
Hanif |
Interna |
Thorpe |
Steven |
Leverantör |
Weiler |
Cornelia |
Interna |
Zare |
Robert |
Om frågorna som ska samordnas till unionsfrågor är mycket olika kan det uppstå en situation där ett utdatafält måste kombinera data av olika datatyper. Om så är fallet returnerar unionsfrågan oftast resultaten som en textdatatyp eftersom den datatypen kan innehålla både text och tal.
För att visa hur detta fungerar använder vi unionsfrågan Produkttransaktioner i Northwind-exempeldatabasen. Öppna exempeldatabasen och öppna sedan frågan Produkttransaktioner i databladsvyn. De sista tio posterna bör se ut ungefär så här:
Produkt-ID |
Orderdatum |
Företagsnamn |
Transaktion |
Antal |
77 |
2006-01-22 |
Leverantör B |
Köp |
60 |
80 |
2006-01-22 |
Leverantör D |
Köp |
75 |
81 |
2006-01-22 |
Leverantör A |
Köp |
125 |
81 |
2006-01-22 |
Leverantör A |
Köp |
200 |
7 |
2006-01-20 |
Företag D |
Försäljning |
10 |
51 |
2006-01-20 |
Företag D |
Försäljning |
10 |
80 |
2006-01-20 |
Företag D |
Försäljning |
10 |
34 |
2006-01-15 |
Företag AA |
Försäljning |
100 |
80 |
2006-01-15 |
Företag AA |
Försäljning |
30 |
Vi antar att du vill dela fältet Antal i två – Köp och Försäljning. Låt oss också anta att du vill ha ett fast nollvärde för fältet utan något värde. Så här kommer SQL-syntaxen att se ut för den här unionsfrågan:
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;
Om du växlar till databladsvyn visas de sista tio posterna så här:
Produkt-ID |
Orderdatum |
Företagsnamn |
Transaktion |
Köp |
Försäljning |
74 |
2006-01-22 |
Leverantör B |
Köp |
20 |
0 |
77 |
2006-01-22 |
Leverantör B |
Köp |
60 |
0 |
80 |
2006-01-22 |
Leverantör D |
Köp |
75 |
0 |
81 |
2006-01-22 |
Leverantör A |
Köp |
125 |
0 |
81 |
2006-01-22 |
Leverantör A |
Köp |
200 |
0 |
7 |
2006-01-20 |
Företag D |
Försäljning |
0 |
10 |
51 |
2006-01-20 |
Företag D |
Försäljning |
0 |
10 |
80 |
2006-01-20 |
Företag D |
Försäljning |
0 |
10 |
34 |
2006-01-15 |
Företag AA |
Försäljning |
0 |
100 |
80 |
2006-01-15 |
Företag AA |
Försäljning |
0 |
30 |
Om du fortsätter med det här exemplet, vad händer om du vill att fälten med noll ska vara tomma? Du kan ändra SQL så att ingenting visas i stället för noll genom att lägga till nyckelordet Null så här:
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 kanske har sett när du växlar till databladsvyn har du nu fått ett oväntat resultat. Alla fält är tomma i kolumnen Köp:
Produkt-ID |
Orderdatum |
Företagsnamn |
Transaktion |
Köp |
Försäljning |
74 |
2006-01-22 |
Leverantör B |
Köp |
||
77 |
2006-01-22 |
Leverantör B |
Köp |
||
80 |
2006-01-22 |
Leverantör D |
Köp |
||
81 |
2006-01-22 |
Leverantör A |
Köp |
||
81 |
2006-01-22 |
Leverantör A |
Köp |
||
7 |
2006-01-20 |
Företag D |
Försäljning |
10 |
|
51 |
2006-01-20 |
Företag D |
Försäljning |
10 |
|
80 |
2006-01-20 |
Företag D |
Försäljning |
10 |
|
34 |
2006-01-15 |
Företag AA |
Försäljning |
100 |
|
80 |
2006-01-15 |
Företag AA |
Försäljning |
30 |
Orsaken till att detta händer är att Access avgör datatyperna för fält utifrån den första frågan. I det här exemplet är Null inte ett tal.
Vad händer om du försöker infoga en tom sträng för det tomma värdet i fälten? SQL för det här försöket kan se ut så här:
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 växlar till databladsvyn ser du att Access hämtar Köp-värden, men värdena konverteras till text. Du ser att dessa är textvärden eftersom de är vänsterjusterade i databladsvyn. Den tomma strängen i första frågan är inte ett tal, det är därför du får det här resultatet. Du ser också att värdena för Försäljning också konverterats till text eftersom köpposterna innehåller en tom sträng.
Produkt-ID |
Orderdatum |
Företagsnamn |
Transaktion |
Köp |
Försäljning |
74 |
2006-01-22 |
Leverantör B |
Köp |
20 |
|
77 |
2006-01-22 |
Leverantör B |
Köp |
60 |
|
80 |
2006-01-22 |
Leverantör D |
Köp |
75 |
|
81 |
2006-01-22 |
Leverantör A |
Köp |
125 |
|
81 |
2006-01-22 |
Leverantör A |
Köp |
200 |
|
7 |
2006-01-20 |
Företag D |
Försäljning |
10 |
|
51 |
2006-01-20 |
Företag D |
Försäljning |
10 |
|
80 |
2006-01-20 |
Företag D |
Försäljning |
10 |
|
34 |
2006-01-15 |
Företag AA |
Försäljning |
100 |
|
80 |
2006-01-15 |
Företag AA |
Försäljning |
30 |
Hur löser du problemet?
En lösning är att tvinga frågan att förvänta att fältvärdet ska vara ett tal. Det kan uppnås med uttrycket:
IIf(False, 0, Null)
Villkoret att kontrollera, Falskt, kommer aldrig att bli Sant, därav returnerar uttrycket alltid Null, men Access utvärderar ändå båda utdataalternativen och bestämmer om resultatet ska vara numeriskt eller Null.
Så här kan vi använda det här uttrycket i vårt arbetsexempel:
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;
Observera att det inte är nödvändigt att ändra den andra frågan.
Om du växlar till databladsvyn ser du nu ett resultat som vi vill ha:
Produkt-ID |
Orderdatum |
Företagsnamn |
Transaktion |
Köp |
Försäljning |
74 |
2006-01-22 |
Leverantör B |
Köp |
20 |
|
77 |
2006-01-22 |
Leverantör B |
Köp |
60 |
|
80 |
2006-01-22 |
Leverantör D |
Köp |
75 |
|
81 |
2006-01-22 |
Leverantör A |
Köp |
125 |
|
81 |
2006-01-22 |
Leverantör A |
Köp |
200 |
|
7 |
2006-01-20 |
Företag D |
Försäljning |
10 |
|
51 |
2006-01-20 |
Företag D |
Försäljning |
10 |
|
80 |
2006-01-20 |
Företag D |
Försäljning |
10 |
|
34 |
2006-01-15 |
Företag AA |
Försäljning |
100 |
|
80 |
2006-01-15 |
Företag AA |
Försäljning |
30 |
Ett annat sätt att uppnå samma resultat är att infoga frågorna i unionsfrågan med en annan fråga:
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
För varje fält returnerar Access fasta värden för den datatyp du definierar. Naturligtvis vill du inte att resultatet av den här frågan ska störa resultatet så tricket för att undvika det är att inkludera en WHERE-sats till Falskt:
WHERE False
Det är ett trick eftersom det alltid är falskt och då returnerar frågan ingenting. Om vi kombinerar det här uttrycket med befintlig SQL får vi ett slutligt uttryck enligt följande:
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 kombinerade frågan i det här exemplet i Northwind-databasen returnerar 100 poster, medan de två enskilda frågorna returnerar 58 och 43 poster, sammanlagt 101 poster. Anledningen till den här avvikelsen är att två poster inte är unika. Läs avsnittet Arbeta med unika poster i unionsfrågor med hjälp av UNION ALL om hur du löser det här scenariot med hjälp av UNION ALL.
Ett specialfall för en unionsfråga är att kombinera en uppsättning poster med en post som innehåller summan av ett eller flera fält.
Här är ett annat exempel som du kan skapa i Northwind-exempeldatabasen för att illustrera hur du får en totalsumma i en unionsfråga.
-
Skapa en ny enkel fråga för att visa köp av öl (Produkt-ID=34 i Northwind-databasen) med hjälp av följande SQL-syntax:
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 växlar till databladsvyn bör du se fyra köp:
Mottaget den
Antal
2006-01-22
100
2006-01-22
60
2006-04-04
50
2006-04-05
300
-
Du får totalsumman genom att skapa en enkel sammanställningsfråga med hjälp av följande SQL:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))
-
När du växlar till databladsvyn bör du endast se en post:
MaxOfDate Received
SumOfQuantity
2006-04-05
510
-
Kombinera följande två frågor i en unionsfråga för att lägga till posten med totalt antal för köpposterna:
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];
-
När du växlar till databladsvyn bör du se de fyra köpen med summan för varje följt av en post som summerar antalet:
Mottaget den
Antal
2006-01-22
60
2006-01-22
100
2006-04-04
50
2006-04-05
300
2006-04-05
510
Det var allt om grunderna för att lägga till summor i en unionsfråga. Du kanske också vill inkludera fasta värden i båda frågorna, till exempel ”Detaljer” och ”Summa”, för att visuellt separera summaposten från de andra posterna. Du kan läsa om att använda fasta värden i avsnittet Kombinera tre eller fler tabeller eller frågor i en unionsfråga.
Unionsfrågor i Access inkluderar som standard endast unika poster. Men vad händer om du vill ta med alla poster? Ett annat exempel kan vara användbart här.
I föregående avsnitt visade vi hur du skapar en totalsumma i en unionsfråga. Ändra den unionsfrågans SQL så att den inkluderar Produkt-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 växlar till databladsvyn bör du se ett något vilseledande resultat:
Mottaget den |
Antal |
2006-01-22 |
100 |
2006-01-22 |
200 |
En post returnerar förstås inte två gånger kvantiteten totalt.
Orsaken till att du ser det här resultatet är att en dag såldes samma kvantitet choklad två gånger – vilket registrerades i tabellen Inköpsorderdetaljer. Här är resultatet av en enkel urvalsfråga som visar båda posterna i Northwind-exempeldatabasen:
Inköpsorder-ID |
Produkt |
Antal |
100 |
Northwind Traders Chocolate |
100 |
92 |
Northwind Traders Chocolate |
100 |
I unionsfrågan som angavs tidigare ser du att fältet Inköpsorder-ID inte finns med och att de två fälten inte är två unika poster.
Om du vill inkludera alla poster kan använda UNION ALL i stället för UNION i SQL. Detta har sannolikt en påverkan på sorteringen av resultatet, så du kanske även vill inkludera en ORDER BY-sats för att bestämma en sorteringsordning. Här visas den ändrade SQL:en som bygger på föregående exempel:
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 växlar till databladsvyn bör du se alla detaljer förutom en summa som den sista posten:
Mottaget den |
Summa |
Antal |
2006-01-22 |
100 |
|
2006-01-22 |
100 |
|
2006-01-22 |
Summa |
200 |
En vanlig användning för en unionsfråga är att fungera som datakälla för en kombinationsrutekontroll i ett formulär. Du kan använda den kombinationsrutan för att välja ett värde för att filtrera posterna i formuläret. Du kan till exempel filtrera poster för anställda efter ort.
För att visa hur det kan fungera visar vi här ett annat exempel som du kan skapa i Northwind-exempeldatabasen för att illustrera scenariot.
-
Skapa en enkel urvalsfråga med hjälp av denna SQL-syntax:
SELECT Employees.City, Employees.City AS Filter FROM Employees;
-
När du växlar till databladsvyn bör du se följande resultat:
Ort
Filter
Seattle
Seattle
Bellevue
Bellevue
Redmond
Redmond
Kirkland
Kirkland
Seattle
Seattle
Redmond
Redmond
Seattle
Seattle
Redmond
Redmond
Seattle
Seattle
-
När du tittar på resultaten kanske du inte ser mycket värde. Men du kan expandera frågan och omvandla den till en unionsfråga med hjälp av följande SQL:
SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;
-
När du växlar till databladsvyn bör du se följande resultat:
Ort
Filter
<Alla>
*
Bellevue
Bellevue
Kirkland
Kirkland
Redmond
Redmond
Seattle
Seattle
Access skapar en union av de nio posterna, som tidigare visats, med de fasta fältvärdena <Alla> och ”*”.
Eftersom den här unionssatsen inte innehåller UNION ALL returnerar Access endast unika poster vilket innebär att varje ort bara returneras en gång med fasta identiska värden.
-
Nu när du har en slutförd unionsfråga som visar varje ortsnamn bara en gång, tillsammans med ett alternativ som effektivt väljer ut alla orter, kan du använda den här frågan som datakälla för en kombinationsruta i ett formulär. Med det här specifika exemplet som en modell kan du skapa en kombinationsrutekontroll i ett formulär, ange den här frågan som dess datakälla, ange egenskapen Kolumnbredd för kolumnen Filter till 0 (noll) för att dölja den visuellt och sedan ange egenskapen Bunden kolumn till 1 för att ange indexet i den andra kolumnen. I egenskapen Filter i själva formuläret kan du sedan lägga till kod enligt följande för att aktivera ett formulärfilter med hjälp av värdet för vad som är markerat i kombinationsrutekontrollen:
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
Användare av formuläret kan sedan filtrera formulärets poster efter ett visst ortsnamn eller välja <Alla> för att visa alla poster för alla orter.