Ibland kanske du vill använda resultatet av en fråga som ett fält i en annan fråga eller som ett villkor för ett frågefält. Anta till exempel att du vill se intervallet mellan order för var och en av dina produkter. Om du vill skapa en fråga som visar intervallet måste du jämföra varje orderdatum med andra orderdatum för produkten. För att kunna jämföra dessa orderdatum krävs också en fråga. Du kan kapsla in den här frågan i huvudfrågan med hjälp av en underfråga.
Du kan skriva en underfråga i en uttryck eller i en Structured Query Language -sats (SQL) i SQL-vy.
I den här artikeln
Använda resultatet av en fråga som ett fält i en annan fråga
Du kan använda en underfråga som ett fältalias. Använd en underfråga som ett fältalias när du vill använda underfrågans resultat som ett fält i huvudfrågan.
Obs!: En underfråga som du använder som fältalias kan inte returnera fler än ett fält.
Du kan använda ett underfrågasfältalias för att visa värden som är beroende av andra värden i den aktuella raden, vilket inte är möjligt utan att använda en underfråga.
Låt oss till exempel gå tillbaka till det exempel där du vill se intervallet mellan order för var och en av dina produkter. För att fastställa det här intervallet måste du jämföra varje orderdatum med andra orderdatum för den produkten. Du kan skapa en fråga som visar den här informationen med hjälp av Northwind-databasmallen.
-
På fliken Arkiv klickar du på Nytt.
-
Klicka på Exempelmallar under Tillgängliga mallar.
-
Klicka på Northwind och sedan på Skapa.
-
Öppna databasen genom att följa anvisningarna på sidan Northwind Traders (på objektfliken Startskärm) och stäng sedan dialogrutan Logga in.
-
Klicka på Frågedesign i gruppen Frågor på fliken Skapa.
-
Klicka på fliken Frågor och dubbelklicka sedan på Produktorder.
-
Dubbelklicka på fältet Produkt-ID och fältet Orderdatum för att lägga till dem i frågerutnätet.
-
På raden Sortera i kolumnen Produkt-ID i rutnätet väljer du Stigande.
-
Välj Fallande på raden Sortera i kolumnen Orderdatum i rutnätet.
-
Högerklicka på raden Fält i den tredje kolumnen i rutnätet och klicka sedan på Zooma på snabbmenyn.
-
Skriv eller klistra in följande uttryck i dialogrutan Zooma :
Prior Date: (SELECT MAX([Order Date])
FROM [Product Orders] AS [Old Orders] WHERE [Old Orders].[Order Date] < [Product Orders].[Order Date] AND [Old Orders].[Product ID] = [Product Orders].[Product ID])Det här uttrycket är underfrågan. För varje rad väljer underfrågan det senaste orderdatumet som är mindre nytt än det orderdatum som redan är kopplat till raden. Observera hur du använder nyckelordet AS för att skapa ett tabellalias, så att du kan jämföra värden i underfrågan med värden i den aktuella raden i huvudfrågan.
-
I den fjärde kolumnen i rutnätet, på raden Fält , skriver du följande uttryck:
Interval: [Order Date]-[Prior Date]
Det här uttrycket beräknar intervallet mellan varje orderdatum och föregående orderdatum för produkten, med hjälp av värdet för föregående datum som vi definierade med hjälp av en underfråga.
-
Klicka på Kör i gruppen Resultat på fliken Design.
-
Frågan körs och visar en lista över produktnamn, orderdatum, tidigare orderdatum och intervallet mellan orderdatum. Resultatet sorteras först efter Produkt-ID (i stigande ordning) och sedan efter Orderdatum (i fallande ordning).
-
Obs!: Eftersom Produkt-ID är ett uppslagsfält visar Access som standard uppslagsvärdena (i det här fallet produktnamnet) i stället för de faktiska produkt-ID:na. Även om värdena som visas ändras ändras inte sorteringsordningen.
-
-
Stäng Northwind-databasen.
Använda en underfråga som ett villkor för ett frågefält
Du kan använda en underfråga som ett fältvillkor. Använd en underfråga som ett fältvillkor när du vill använda resultatet av underfrågan för att begränsa vilka värden som visas i fältet.
Anta till exempel att du vill granska en lista med order som bearbetats av anställda som inte är försäljningsrepresentanter. Om du vill generera den här listan måste du jämföra anställnings-ID:t för varje order med en lista med anställnings-ID:na för anställda som inte är försäljningsrepresentanter. Om du vill skapa den här listan och använda den som ett fältvillkor använder du en underfråga, enligt följande procedur:
-
Öppna Northwind.accdb och aktivera dess innehåll.
-
Stäng inloggningsformuläret.
-
Klicka på Frågedesign i gruppen Annat på fliken Skapa.
-
Dubbelklicka på Order och Anställda på fliken Tabeller.
-
I tabellen Order dubbelklickar du på fältet Anställnings-ID , fältet Order-ID och fältet Orderdatum för att lägga till dem i frågerutnätet. Dubbelklicka på fältet Befattning i tabellen Anställda för att lägga till det i designrutnätet.
-
Högerklicka på raden Villkor i kolumnen Anställnings-ID och klicka sedan på Zooma på snabbmenyn.
-
Skriv eller klistra in följande uttryck i rutan Zooma :
IN (SELECT [ID] FROM [Employees]
WHERE [Job Title]<>'Sales Representative')Det här är underfrågan. Där markeras alla anställnings-ID:ar där den anställde inte har befattningen Säljare och leveranser som är inställda på huvudfrågan. Huvudfrågan kontrollerar sedan om anställnings-ID:na från tabellen Order finns med i resultatuppsättningen.
-
Klicka på Kör i gruppen Resultat på fliken Design.
Frågan körs och frågeresultatet visar en lista över order som bearbetats av anställda som inte är försäljningsrepresentanter.
Vanliga SQL-nyckelord som du kan använda med en underfråga
Det finns flera SQL-nyckelord som du kan använda med en underfråga:
Obs!: Denna förteckning är inte uttömmande. Du kan använda ett giltigt SQL-nyckelord i en underfråga, med undantag av nyckelord för datadefinitioner.
-
ALLA Använd ALL i en WHERE-sats för att hämta rader som uppfyller villkoret jämfört med varje rad som returneras av underfrågan.
Anta till exempel att du analyserar elevdata på en högskola. Studenterna måste ha ett minsta GPA, som varierar från major till major. Huvudämnen och deras lägsta gpas lagras i en tabell med namnet Huvudämnen, och relevant elevinformation lagras i en tabell som heter Student_Records.
Om du vill se en lista över huvudämnen (och deras lägsta gpas) för vilka varje elev med det huvudämnet överskrider det minsta GPA kan du använda följande fråga:
SELECT [Major], [Min_GPA]
FROM [Majors] WHERE [Min_GPA] < ALL (SELECT [GPA] FROM [Student_Records] WHERE [Student_Records].[Major]=[Majors].[Major]); -
NÅGON Använd ANY i en WHERE-sats för att hämta rader som uppfyller villkoret jämfört med minst en av de rader som returneras av underfrågan.
Anta till exempel att du analyserar elevdata på en högskola. Studenterna måste ha ett minsta GPA, som varierar från major till major. Huvudämnen och deras lägsta gpas lagras i en tabell med namnet Huvudämnen, och relevant elevinformation lagras i en tabell som heter Student_Records.
Om du vill se en lista över huvudämnen (och deras lägsta gpas) för vilka alla elever med det huvudämnet inte uppfyller minimi-GPA, kan du använda följande fråga:
SELECT [Major], [Min_GPA]
FROM [Majors] WHERE [Min_GPA] > ANY (SELECT [GPA] FROM [Student_Records] WHERE [Student_Records].[Major]=[Majors].[Major]);Obs!: Du kan också använda nyckelordet SOME för samma ändamål. nyckelordet SOME är synonymt med ANY.
-
FINNS Använd EXISTS i en WHERE-sats för att ange att en underfråga ska returnera minst en rad. Du kan också förorda EXISTS med NOT för att ange att en underfråga inte ska returnera några rader.
Följande fråga returnerar till exempel en lista över produkter som finns i minst en befintlig order:
SELECT *
FROM [Products] WHERE EXISTS (SELECT * FROM [Order Details] WHERE [Order Details].[Product ID]=[Products].[ID]);Med ICKE BEFINTLIGT returnerar frågan en lista över produkter som inte finns i minst en befintlig order:
SELECT *
FROM [Products] WHERE NOT EXISTS (SELECT * FROM [Order Details] WHERE [Order Details].[Product ID]=[Products].[ID]); -
I Använd IN i en WHERE-sats för att verifiera att ett värde på den aktuella raden i huvudfrågan är en del av den uppsättning som underfrågan returnerar. Du kan också inleda IN med ICKE för att verifiera att ett värde på den aktuella raden i huvudfrågan inte är en del av den uppsättning som underfrågan returnerar.
Följande fråga returnerar till exempel en lista med order (med orderdatum) som bearbetats av anställda som inte är försäljningsrepresentanter:
SELECT [Order ID], [Order Date]
FROM [Orders] WHERE [Employee ID] IN (SELECT [ID] FROM [Employees] WHERE [Job Title]<>'Sales Representative');Genom att använda NOT IN kan du skriva samma fråga på det här sättet:
SELECT [Order ID], [Order Date]
FROM [Orders] WHERE [Employee ID] NOT IN (SELECT [ID] FROM [Employees] WHERE [Job Title]='Sales Representative');