Kapsla en fråga i en annan fråga eller i ett uttryck genom att använda en underfråga

Ibland kan man vilja använda resultatet från en fråga för att ställa en ny fråga eller som villkor för ett frågefält. Anta t.ex. att du vill se intervallet mellan order för var och en av dina produkter. Genom att jämföra varje orderdatum för den produkten kan du skapa en fråga som visar detta intervall. Det krävs en fråga även för att jämföra dessa order. Du kan kapsla den frågan i din huvudfråga genom att använda en underfråga.

Du kan skriva en underfråga i ett uttryck eller i ett SQL-uttryck (Structured Query Language) i SQL-vy.

I den här artikeln

Använda resultaten av en fråga som ett fält i en annan fråga

Använda en underfråga som ett villkor för ett frågefält

Gemensamma SQL-nyckelord som du kan använda med en underfråga

Använda resultaten av en fråga som ett fält i en annan fråga

Du kan använda en underfråga som ett alias (SQL). 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 används som ett fältalias kan inte returnera mer än ett fält.

Du kan använda ett alias för underfrågefält 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.

Vi återgår till exemplet där du vill se intervallerna mellan order för var och en av produkterna. För att fastställa det här intervallet måste du jämföra varje orderdatum med övriga orderdatum för produkten. Du kan skapa en fråga som visar den här informationen genom att använda mallen i Northwind-databasen.

Visa hur jag gör inställningar i Northwind

  1. Klicka på Nytt på fliken Arkiv.

  2. Klicka på Exempelmallar under Tillgängliga mallar.

  3. Klicka på Northwind och sedan på Skapa.

  4. Öppna databasen genom att följa anvisningarna på sidan Northwind Traders (på objektfliken Startskärm) och stäng sedan dialogrutan Logga in.

  1. Klicka på Frågedesign i gruppen Frågor på fliken Skapa.

  2. Klicka på fliken Frågor i dialogrutan Visa tabell och dubbelklicka sedan på Produktorder.

  3. Stäng dialogrutan Visa tabell.

  4. Genom att dubbelklicka på fältet Produkt-ID och Orderdatum lägger du till dem på frågerutnätet.

  5. Markera Stigande på raden Sortera i rutnätets kolumn för Produkt-ID.

  6. Markera Fallande på raden Sortera i rutnätskolumnen Orderdatum.

  7. Högerklicka på raden Fält och klicka sedan på Zooma på snabbmenyn i tredje kolumnen på rutnätet.

  8. 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 en underfråga. För varje rad väljer underfrågan det senaste orderdatum som ligger bakom det orderdatum som har associerats med raden. Kontrollera hur du använder AS-nyckelordet 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 på huvudfrågan.

  1. Skriv följande uttryck på raden Fält i fjärde kolumnen i rutnätet:

    Interval: [Order Date]-[Prior Date]

Det här uttrycket beräknar intervallet mellan varje orderdatum och föregående orderdatum för produkten, genom att använda värdet för föregående datum som vi har definierat genom att använda en underfråga.

  1. Klicka på Kör i gruppen Resultat på fliken Design.

    1. Frågan körs och visar en lista över produktnamn, orderdatum, föregående orderdatum och intervall mellan orderdatum. Resultaten sorteras först enligt produkt-ID (i stigande ordning) och sedan enligt orderdatum (i fallande ordning).

    2. Obs!: Eftersom produkt-ID är ett uppslagsfält visas som standard uppslagsvärden med Access (i det här fallet produktnamnet), i stället för faktiska produkt-ID. Trots att detta ändrar värdena som visas ändras inte sorteringsordningen.

  2. Stäng Northwind.

Överst på sidan

Använda en underfråga som ett villkor för ett frågefält

Du kan använda en underfråga som ett villkor. Begränsa värdena som fältet visar genom att använda en underfråga som ett fältvillkor när du vill använda resultaten för underfrågan.

Anta exempelvis att du vill granska en lista över order som bearbetades av anställda som inte är säljare. För att generera en lista måste du jämföra anställnings-ID för varje order med en lista över anställnings-ID för anställda som inte är säljare. Genom att använda en underfråga, som visas i följande procedur, skapar du den här listan och den kan användas som fältvillkor:

  1. Öppna Northwind 2007.accdb och aktivera innehållet.

  2. Stäng inloggningsformuläret.

  3. Klicka på Frågedesign i gruppen Annat på fliken Skapa.

  4. Dubbelklicka på Order och Anställda i dialogrutan Visa tabell på fliken Tabell.

  5. Stäng dialogrutan Visa tabell.

  6. Gå till ordertabellen och dubbelklicka på fältet Anställnings-ID, sedan Order-ID och Orderdatum för att lägga till dem i frågerutnätet. Dubbelklicka på Jobbtitel i tabellen för anställda för att lägga till den i rutnätet.

  7. Högerklicka på raden Villkor för kolumnen för anställnings-ID och klicka sedan på Zooma på snabbmenyn.

  8. 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. Den väljer alla anställnings-ID där anställda inte har en jobbtitel för säljare och returnerar resultatuppsättningen för huvudfrågan. Huvudfrågan kontrollerar sedan om anställnings-ID från ordertabellen är i resultatuppsättningen.

  9. Klicka på Kör i gruppen Resultat på fliken Design.

    Frågan körs och frågeresultaten visar en lista över order som bearbetades av anställda som inte är säljare.

Överst på sidan

Gemensamma 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!: Den här listan är inte utförlig. Du kan använda alla giltiga SQL-nyckelord i en underfråga, utom datadefinitionsnyckelord.

  • ALL    Använd ALL i en WHERE-sats för att hämta rader som uppfyller villkoren när de jämförs med varje rad som returneras av underfrågan.

Anta exempelvis att du analyserar studentdata vid ett universitet. Studenterna måste bibehålla ett minimalt medelbetyg, som varierar från ämne till ämne. Ämnen och deras minimibetygsnivåer lagras i tabellen med namnet Ämnen och relevant studentinformation lagras i tabellen Student_Records.

Du kan använda följande fråga för att visa en lista över ämnen (och minimala medelbetyg) för varje student där medelbetyget överskrider den minimala nivån:

SELECT [Major], [Min_GPA] 
FROM [Majors]
WHERE [Min_GPA] < ALL
(SELECT [GPA] FROM [Student_Records]
WHERE [Student_Records].[Major]=[Majors].[Major]);
  • ANY    Använd ordet ANY i en WHERE-sats för att hämta rader som uppfyller villkoren i en jämförelse med minst en av raderna som returneras av underfrågan.

    Anta exempelvis att du analyserar studentdata vid ett universitet. Studenterna måste bibehålla ett minimalt medelbetyg, som varierar från ämne till ämne. Ämnen och deras minimibetygsnivåer lagras i tabellen med namnet Ämnen och relevant studentinformation lagras i tabellen Student_Records..

    Du kan använda följande fråga för att visa en lista över ämnen (och minimala medelbetyg) för varje student där medelbetyget överskrider den minimala nivån:

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] > ANY
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);

    Obs!: Du kan även använda SOME-nyckelordet i samma syfte; SOME-nyckelordet är synonymt med ANY.

  • EXISTS    Använd ordet EXISTS i en WHERE-sats för att indikera att underfrågan ska returnera minst en rad. Du kan även skriva NOT före EXISTS för att indikera att underfrågan inte ska returnera några rader.

    Följande fråga returnerar exempelvis en lista över produkter som hittas i minst en befintlig order:

    SELECT *
    FROM [Products]
    WHERE EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);

    Vid användning av NOT EXISTS returnerar frågan en lista över produkter som inte hittas i minst en befintlig order:

    SELECT *
    FROM [Products]
    WHERE NOT EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);
  • IN    Använd ordet IN i en WHERE-sats för att verifiera att ett värde i den aktuella raden för huvudfrågan är en del av uppsättningen som underfrågan returnerar. Du kan även skriva NOT före IN för att verifiera att ett värde i den aktuella raden för huvudfrågan inte är en del av den uppsättningen som underfrågan returnerar.

    Följande fråga returnerar exempelvis en lista över order (med orderdatum) som bearbetades av anställda som inte är säljare:

    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å följande sätt:

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] NOT IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]='Sales Representative');

Överst på sidan

Utöka dina kunskaper
Utforska utbildning
Få nya funktioner först
Anslut till Office Insiders

Hade du nytta av den här informationen?

Tack för din feedback!

Tack för din feedback! Det låter som att det kan vara bra att koppla dig till en av våra Office-supportrepresentanter.

×