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 kombinera poster från en tabell eller fråga med poster från en eller flera andra tabeller till ett enda resultat. Det är vad en unionsfråga gör 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 bra att först studera ett arbetsexempel i mallen Northwind Access. Du kan söka efter Northwind-exempelmallen på sidan Komma igång i Access genom att välja Arkiv>nytt. Du kan också ladda ned en kopia direkt från Northwind-exempelmallen.

När Northwind-databasen öppnas i Access stänger du dialogrutan för inloggning som först visas och expanderar sedan navigeringsfönstret. Välj 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. Det innebär att du inte kan använda Access-grafikfrågedesignern för att skapa eller redigera unionsfrågor. Om du öppnar en unionsfråga från navigeringsfönstret öppnas den i Access och resultatet visas i databladsvyn. Under Vyer på fliken Start märker du att designvyn inte är tillgänglig när du arbetar med unionsfrågor. Du kan bara växla mellan databladsvyn och SQL-vyn.

Om du vill fortsätta att studera det här unionsfrågeexemplet klickar du påSQL-vynStartvyer>> för att visa syntaxen SQL som definierar den. I den här bilden har vi lagt till lite extra avstånd i SQL så att du enkelt kan se de olika delarna som utgör en unionsfråga.

Låt oss titta på syntaxen för den SQL 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 den här SQL instruktionen är nyckelordet UNION , som instruerar Access att kombinera dessa två uppsättningar poster.

Den sista delen av den här SQL instruktionen avgör ordningen på de kombinerade posterna med hjälp av ett ORDER BY uttryck. I det här exemplet orderas 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 skriva syntaxen SQL direkt 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 satserna SQL .

  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 View-objektfliken . I det här läget är fliken 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 uttrycket SQL för urvalsfrågan. Klicka på fliken för unionsfrågan som du började skapa tidigare.
  6. Klistra in instruktionen SQL för urvalsfrågan på objektfliken SQL View i unionsfrågan.
  7. Ta bort semikolonet (;) i slutet av select-frågesatsen SQL .
  8. Tryck på Retur för att flytta markören en rad nedåt och skriv UNION sedan 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 tills du har kopierat och klistrat in alla SQL uttryck för urvalsfrågorna i SQL-vyfönstret för unionsfrågan. Ta inte bort semikolonet eller skriv något efter uttrycket SQL för den senaste urvalsfrå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 ordersats i en av frågorna och klistra sedan in ORDER BY uttrycket i unionsfrågan i SQL-vyn. 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. Det sista SQL som kombinerar och sorterar namnen för det här exemplet på 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 känner dig 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 från föregående avsnitt som använder Northwind-databasen kombineras data från endast 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 visa 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å SQL här ser det 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

Du kan minska frågan ytterligare eftersom Access läser upp namnen på utdatafälten endast från den första frågan i en unionsfråga. Här tas utdata från det andra och tredje frågeavsnittet bort:


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

I en unionsfråga i Access tillåts ordning endast en gång, men du kan filtrera varje fråga individuellt. Här är ett exempel som filtrerar varje fråga genom att lägga till en WHERE sats, utifrån föregående avsnitts unionsfråga.


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 du union är väldigt olika kan du stöta på en situation där ett utdatafält måste kombinera data med 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

Anta att du vill dela upp fältet Antal i två fält: Köp och Sälj. Anta också att du vill ha ett fast nollvärde för fältet utan värde. Så här ser unionsfrågan SQL ut:

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 nollvärden 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å som visas 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 fältens tomma värde? För SQL det här försöket kan det 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 sig att fältvärdet ska vara ett tal. Det kan du göra med det här uttrycket:


IIf(False, 0, Null)

Villkoret att kontrollera, Falseär aldrig True, så uttrycket returnerar Nullalltid . Access utvärderar dock fortfarande båda utdataalternativen och behandlar utdata som numeriska 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;

Du behöver inte ä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 här är ett litet trick. Eftersom villkoret alltid är falskt 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

I det här exemplet returnerar den kombinerade frågan i Northwind-databasen 100 poster, medan de två enskilda frågorna returnerar 58 och 43 poster för totalt 101 poster. Den här skillnaden beror på att två poster inte är unika. Mer information om hur du löser det här scenariot finns i Arbeta med distinkta poster i unionsfrågor med hjälp av UNION ALL.UNION ALL

Lägga till summor i en unionsfråga

En särskild användning 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 unionsfrågan SQL så att den inkluderar 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 växlar till databladsvyn bör du se ett något vilseledande resultat:

Mottaget den Antal
2006-01-22 100
2006-01-22 200

Naturligtvis returnerar en post inte dubbelt så mycket som det totala antalet.

Det här resultatet visas eftersom samma kvantitet choklad en dag såldes två gånger, som registrerats 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 ta med alla poster använder UNION ALL du i stället för UNION i .SQL Detta påverkar sannolikt sorteringen av resultaten, så du kanske också vill ta med en ORDER BY sats för att bestämma en sorteringsordning. Här är den ändrade SQL baserat 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 den här SQL syntaxen:

    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 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 ALLreturnerar Access bara distinkta poster. Det 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. Filter I egenskapen för själva formuläret kan du sedan lägga till kod som följande för att aktivera ett formulärfilter med hjälp av värdet 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