Užklausos įdėjimas į kitą užklausą arba reiškinį naudojant antrinę užklausą

Taikoma
„Access“, skirta „Microsoft 365“ „Access 2024“ Access 2021 Access 2019 Access 2016

Kartais užklausos rezultatus galite norėti naudoti kaip lauką kitoje užklausoje arba kaip užklausos lauko kriterijų. Tarkime, norite matyti kiekvieno produkto užsakymų intervalą. Norėdami sukurti užklausą, rodančią šį intervalą, turite palyginti kiekvieno užsakymo datą su kitomis to produkto užsakymo datomis. Norint palyginti šias užsakymo datas, taip pat būtina pateikti užklausą. Šią užklausą galite įdėti į pagrindinę užklausą naudodami antrinę užklausą.

Galite rašyti antrinę užklausą reiškinyje arba Struktūrinių užklausų kalbos (SQL) sakinyje SQL rodinyje.

Šiame straipsnyje:

Užklausos rezultatų kaip lauko naudojimas kitoje užklausoje

Galite naudoti antrinę užklausą kaip lauko pseudonimą. Naudokite antrinę užklausą kaip lauko pseudonimą, jei norite naudoti antrinės užklausos rezultatus kaip lauką pagrindinėje užklausoje.

Pastaba

Antrinė užklausa, kurią naudojate kaip lauko pseudonimą, negali grąžinti daugiau nei vieno lauko.

Galite naudoti antrinės užklausos lauko pseudonimą reikšmėms, priklausančioms nuo kitų reikšmių dabartinėje eilutėje, rodyti, o tai neįmanoma nenaudojant antrinės užklausos.

Pavyzdžiui, grįžkime prie pavyzdžio, kuriame norite pamatyti intervalą tarp kiekvieno iš savo produktų užsakymų. Norėdami nustatyti šį intervalą, turite palyginti kiekvieno užsakymo datą su kitomis to produkto užsakymo datomis. Naudodami "Northwind" duomenų bazės šabloną galite sukurti užklausą, rodančią šią informaciją.

  1. Skirtuke Failas spustelėkite Naujas.

  2. Dalyje Galimi šablonai spustelėkite Pavyzdiniai šablonai.

  3. Spustelėkite "Northwind", tada spustelėkite Kurti.

  4. Vykdydami puslapyje „Northwind“ prekiautojai (objekto skirtuke Paleisties ekranas) pateiktus nurodymus atidarykite duomenų bazę, o tada uždarykite prisijungimo dialogo langą.

  5. Skirtuko Kūrimas grupėje Užklausos spustelėkite Užklausos dizainas.

  6. Spustelėkite skirtuką Užklausos , tada dukart spustelėkite Produkto užsakymai.

  7. Dukart spustelėkite laukus Produkto ID ir Užsakymo data , kad įtrauktumėte juos į užklausos dizaino tinklelį.

  8. Tinklelio stulpelio Produkto ID eilutėje Rūšiuoti pasirinkite Didėjimo tvarka.

  9. Tinklelio stulpelio Užsakymo data eilutėje Rūšiuoti pasirinkite Mažėjančia tvarka.

  10. Trečiame tinklelio stulpelyje dešiniuoju pelės mygtuku spustelėkite eilutę Laukas , tada laikinajame meniu spustelėkite Mastelio keitimas .

  11. Mastelio keitimo dialogo lange įveskite arba įklijuokite šią išraišką:

    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])
    
    

    Šis reiškinys yra antrinė užklausa. Kiekvienai eilutei antrinė užklausa pasirenka naujausią užsakymo datą, kuri yra ne tokia užsakymo data, kuri jau susieta su eilute. Atkreipkite dėmesį, kaip naudojate raktažodį AS lentelės pseudonimui sukurti, kad galėtumėte palyginti reikšmės antrinėje užklausoje su reikšmėmis dabartinėje pagrindinės užklausos eilutėje.

  12. Ketvirtame tinklelio stulpelyje, eilutėje Laukas , įveskite šią išraišką:
    Interval: [Order Date]-[Prior Date]
    Ši išraiška apskaičiuoja intervalą tarp kiekvieno užsakymo datos ir ankstesnio užsakymo datos, naudodama ankstesnės datos reikšmę, kurią apibrėžėme naudodami antrinę užklausą.

  13. Skirtuko Dizainas grupėje Rezultatai spustelėkite Vykdyti.

    1. Užklausa vykdoma ir rodomas produktų pavadinimų, užsakymų datų, ankstesnių užsakymų datų ir intervalo tarp užsakymų datų sąrašas. Rezultatai pirmiausia rikiuojami pagal produkto ID (didėjimo tvarka), tada pagal užsakymo datą (mažėjimo tvarka).
    2. Pastaba

      Kadangi Produkto ID yra peržvalgos laukas, pagal numatytuosius nustatymus "Access" rodo peržvalgos reikšmes (šiuo atveju produkto pavadinimą), o ne faktinius produkto ID. Nors tai pakeičia rodomas reikšmes, rikiavimo tvarka nepakeičiama.

  14. Uždarykite "Northwind" duomenų bazę.

Puslapio viršus

Antrinės užklausos kaip užklausos lauko kriterijaus naudojimas

Galite naudoti antrinę užklausą kaip lauko kriterijų. Naudokite antrinę užklausą kaip lauko kriterijų, jei norite naudoti antrinės užklausos rezultatus, kad apribotumėte lauke rodomas reikšmes.

Tarkime, norite peržiūrėti sąrašą užsakymų, kuriuos apdorojo darbuotojai, kurie nėra pardavimo atstovai. Norėdami sugeneruoti šį sąrašą, turite palyginti kiekvieno užsakymo darbuotojo ID su darbuotojų, kurie nėra pardavimo atstovai, ID sąrašu. Norėdami sukurti šį sąrašą ir naudoti jį kaip lauko kriterijų, naudokite antrinę užklausą, kaip parodyta šioje procedūroje:

  1. Atidarykite Northwind.accdb ir įgalinkite jo turinį.

  2. Uždarykite prisijungimo formą.

  3. Skirtuko Kūrimas grupėje Kita spustelėkite Užklausos dizainas.

  4. Skirtuke Lentelės dukart spustelėkite Užsakymai ir Darbuotojai.

  5. Lentelėje Užsakymai dukart spustelėkite lauką Darbuotojo ID , Užsakymo ID ir Užsakymo data , kad įtrauktumėte juos į užklausos dizaino tinklelį. Lentelėje Darbuotojai dukart spustelėkite lauką Pareigos , kad jį įtrauktumėte į dizaino tinklelį.

  6. Dešiniuoju pelės mygtuku spustelėkite stulpelio Darbuotojo ID eilutę Kriterijai , tada kontekstiniame meniu spustelėkite Mastelio keitimas .

  7. Mastelio keitimo lauke įveskite arba įklijuokite šią išraišką:

    IN (SELECT [ID] FROM [Employees] 
    WHERE [Job Title]<>'Sales Representative')
    
    

    Tai yra antrinė užklausa. Jis pasirenka visus darbuotojų ID, jei darbuotojas neturi pardavimo atstovo pareigų, ir pateikia šį rezultatų rinkinį pagrindinėje užklausoje. Tada pagrindinė užklausa patikrina, ar darbuotojų ID iš lentelės Užsakymai yra rezultatų rinkinyje.

  8. Skirtuko Dizainas grupėje Rezultatai spustelėkite Vykdyti.
    Užklausa vykdoma, o užklausos rezultatuose rodomas sąrašas užsakymų, kuriuos apdorojo darbuotojai, kurie nėra pardavimo atstovai.

Puslapio viršus

Įprasti SQL raktažodžiai, kuriuos galite naudoti su antrine užklausa

Yra keli SQL raktažodžiai, kuriuos galite naudoti su antrine užklausa:

Pastaba

Šis sąrašas nėra baigtinis. Antrinėje užklausoje galite naudoti bet kokį galiojantį SQL raktažodį, išskyrus duomenų aprašo raktažodžius.

  • VISI Naudokite ALL sąlygoje WHERE, kad gautumėte eilutes, kurios atitinka sąlygą, palyginus su kiekviena eilute, kurią pateikia antrinė užklausa.
    Tarkime, analizuojate studentų duomenis aukštojoje mokykloje. Studentai turi išlaikyti minimalų GPA, kuris skiriasi priklausomai nuo pagrindinio. Specializacijos ir jų minimalūs GPA saugomi lentelėje, pavadintoje Specializacijos, o atitinkama studentų informacija saugoma lentelėje, vadinamoje Student_Records.
    Norėdami pamatyti specializacijų (ir jų minimalių GPA), kurių studentas viršija minimalų GPA, sąrašą, galite naudoti šią užklausą:

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] < ALL
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);
    
    
  • BET KOKS Sąlygoje WHERE naudokite ANY, kad gautumėte eilutes, kurios atitinka sąlygą, palyginti su bent viena iš antrinės užklausos pateiktų eilučių.
    Tarkime, analizuojate studentų duomenis aukštojoje mokykloje. Studentai turi išlaikyti minimalų GPA, kuris skiriasi priklausomai nuo pagrindinio. Specializacijos ir jų minimalūs GPA saugomi lentelėje, pavadintoje Specializacijos, o atitinkama studentų informacija saugoma lentelėje, vadinamoje Student_Records.
    Norėdami pamatyti specialybių (ir jų minimalių GPA), kurioms bet kuris studentas, turintis tą specialybę, neatitinka minimalaus GPA, sąrašą, galite naudoti šią užklausą:

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

    Pastaba

    Taip pat galite naudoti raktažodį SOME tam pačiam tikslui; raktažodis SOME yra ANY sinonimas.

  • EGZISTUOJA Naudokite EXISTS sąlygoje WHERE, norėdami nurodyti, kad antrinė užklausa turėtų grąžinti bent vieną eilutę. Taip pat galite įžangoje EXISTS su NOT, kad nurodytumėte, kad antrinė užklausa neturėtų grąžinti jokių eilučių.
    Pavyzdžiui, ši užklausa pateikia sąrašą produktų, kurie yra bent viename esamame užsakyme:

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

    Naudojant NOT EXISTS užklausa grąžina sąrašą produktų, kurių nėra bent viename esamame užsakyme:

    SELECT *
    FROM [Products]
    WHERE NOT EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);
    
    
  • IN Naudokite IN sąlygoje WHERE, norėdami patikrinti, ar reikšmė pagrindinėje užklausos dabartinėje eilutėje yra rinkinio, kurį pateikia antrinė užklausa, dalis. Taip pat galite įvesti įvadą IN ir NOT, kad patikrintumėte, ar reikšmė pagrindinėje užklausos dabartinėje eilutėje nėra rinkinio, kurį pateikia antrinė užklausa, dalis.
    Pavyzdžiui, ši užklausa pateikia sąrašą užsakymų (su užsakymų datomis), kuriuos apdorojo darbuotojai, kurie nėra pardavimo atstovai:

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

    Naudojant NOT IN, galima tą pačią užklausą rašyti tokiu būdu:

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

Puslapio viršus