Använd en unionsfråga för att kombinera flera frågor till ett resultat

Gäller för
Access för Microsoft 365 Access 2024 Access 2021 Access 2019 Access 2016

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 i Access genom att klicka på Arkiv>nytt eller så kan du ladda ned en kopia direkt från den här platsen: 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:

Skärmbild av en unionsfrågeikon i Access. 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 studera det här unionsfrågeexemplet klickar du påSql-vynStartvyer>> 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.

Låt oss studera SQL-syntaxen för 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.

  1. Klicka på Frågedesign i gruppen Frågor på fliken Skapa.
  2. Dubbelklicka på tabellen som innehåller de fält som du vill ta med. Tabellen läggs till i frågedesignfönstret.
  3. 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.
  4. 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.
  5. 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.
  6. Växla frågan till designvyn.
  7. Spara Select-frågan och lämna den öppen.
  8. 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.

  1. Klicka på Frågedesign i gruppen Frågor på fliken Skapa.
  2. 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.
  3. Klicka på fliken för den första Select-frågan du vill kombinera i unionsfrågan.
  4. Klicka på Visa>SQL-vy på fliken Start.
  5. Kopiera SQL-uttrycket för Select-frågan. Klicka på fliken för unionsfrågan som du började skapa tidigare.
  6. Klistra in SQL-uttrycket för Select-frågan på unionsfrågans objektflik för SQL-vyn.
  7. Ta bort semikolonet (;) som ligger i slutet av Select-frågans SQL-uttryck.
  8. Tryck på Retur för att flytta ned markören en rad och skriv sedan UNION på den nya raden.
  9. Klicka på fliken för nästa Select-fråga som du vill kombinera i unionsfrågan.
  10. 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.
  11. 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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Kombinera tre eller fler tabeller eller frågor i en unionsfråga

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ärskilt 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];

Filtrering i unionsfrågor

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

Blanda datatyper

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.

Lägga till summor i en unionsfråga

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.

  1. 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];
    
  2. 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
  3. 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))
    
  4. När du växlar till databladsvyn bör du endast se en post:

    MaxOfDate Received SumOfQuantity
    2006-04-05 510
  5. 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];
    
  6. 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 ta med fasta värden i båda frågorna, till exempel "Information" och "Summa", för att visuellt skilja den totala posten 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.

Arbeta med unika poster i unionsfrågor med hjälp av UNION ALL

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 tidigare nämnts kan du se att fältet Inköpsorder-ID inte ingår och att de två fälten inte utgör två distinkta 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

Använda en unionsfråga för att filtrera poster i ett formulär med hjälp av en kombinationsrutekontroll

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.

  1. Skapa en enkel urvalsfråga med hjälp av denna SQL-syntax:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
    
  2. 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
  3. 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;
    
  4. När du växlar till databladsvyn bör du se följande resultat:

    Ort Filter
    <Allt> *
    Bellevue Bellevue
    Kirkland Kirkland
    Redmond Redmond
    Seattle Seattle

    Access utför en union av de nio posterna, som tidigare visades, med fasta fältvärden för <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.

  5. 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ändaren av formuläret kan sedan filtrera formulärposterna till ett visst ortsnamn eller välja <Alla> för att visa alla poster för alla städer.

Överst på sidan