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

Galbūt kartais užklausos rezultatus norėsite naudoti kaip kitos užklausos lauką arba užklausos lauko kriterijų. Pvz., tarkim, norite peržiūrėti intervalus tarp kiekvieno produkto užsakymų. Norėdami sukurti užklausą, kurioje būtų rodomas toks intervalas, kiekvieno užsakymo datą turite palyginti su kitų to produkto užsakymų datomis. Norint palyginti šias datas taip pat reikia naudoti užklausą. Šią užklausą galite įdėti į pagrindinę užklausą naudodami antrinė užklausa.

Antrinę užklausą galite įrašyti į išraiška arba struktūrinių užklausų kalbos (SQL) sakinį SQL rodinys.

Šiame straipsnyje

Užklausos rezultatų naudojimas kaip kitos užklausos lauko

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

Įprasti SQL raktažodžiai, kuriuos galima naudoti antrinėje užklausoje

Užklausos rezultatų naudojimas kaip kitos užklausos lauko

Antrinę užklausą galite naudoti kaip lauko pseudonimas (SQL). Naudokite antrinę užklausą kaip lauko pseudonimą, jei antrinės užklausos rezultatus norite naudoti kaip pagrindinės užklausos lauką.

Pastaba : Antrinėje užklausoje, kurią naudojate kaip lauko pseudonimą, negali būti pateikta daugiau nei vienas laukas.

Antrinės užklausos lauko pseudonimą galite naudoti norėdami, kad būtų rodomos reikšmės, kurias lemia kitos dabartinės eilutės reikšmės – nenaudojant antrinės užklausos to padaryti neįmanoma.

Pvz., grįžkime prie pavyzdžio, kai turi būti rodomas intervalas tarp kiekvieno produkto užsakymų. Norint nustatyti šį intervalai, kiekvieno užsakymo datą reikia palyginti su kitomis to produkto užsakymų datomis. Norėdami sukurti šią informaciją rodančią užklausą, galite naudoti „Northwind“ duomenų bazės šabloną.

Kaip nustatyti „Northwind“

  1. Skirtuke Failas spustelėkite Naujas.

  2. Dalyje Galimi šablonai spustelėkite Šablonų pavyzdžiai.

  3. Spustelėkite Northwind, o tada – Kurti.

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

  1. Skirtuko Kurti grupėje Užklausos spustelėkite Užklausos dizainas.

  2. Dialogo lange Lentelės rodymas spustelėkite skirtuką Užklausos, o tada dukart spustelėkite Produkto užsakymai.

  3. Uždarykite dialogo langą Lentelės rodymas.

  4. Kad į užklausos dizaino tinklelį būtų įtraukti laukai Produkto ID ir Užsakymo data, dukart juos spustelėkite.

  5. Tinklelio stulpelyje Produkto ID, eilutėje Rikiuoti pažymėkite Didėjimo tvarka.

  6. Tinklelio stulpelyje Užsakymo data, eilutėje Rikiuoti pažymėkite Mažėjimo tvarka.

  7. Trečiajame tinklelio stulpelyje dešiniuoju pelės mygtukus spustelėkite eilutę Laukas, tada kontekstiniame meniu spustelėkite Mastelio keitimas.

  8. Dialogo lange Mastelio keitimas įveskite arba įklijuokite šį reiškinį:

    Ankstesnė data: (SELECT MAX([Užsakymo data]) 
    FROM [Produkto užsakymai] AS [Seni užsakymai]
    WHERE [Seni užsakymai].[Užsakymo data] < [Produkto užsakymai].[Užsakymo data]
    AND [Seni užsakymai].[Produkto ID] = [Produkto užsakymai].[Produkto ID])

Šis reiškinys yra antrinė užklausa. Kiekvienoje eilutėje antrinė užklausa parenka vėliausią, bet ankstesnę už jau su eilute susietą, užsakymo datą. Atkreipkite dėmesį, kaip kuriant lentelės pseudonimą turi būti naudojamas raktažodis AS, kad antrinės užklausos reikšmės būtų lyginamos su pagrindinės užklausos dabartinės eilutės reikšmėmis.

  1. Ketvirtajame tinklelio stulpelyje, eilutėje Laukas įveskite šį reiškinį:

    Intervalas: [Užsakymo data]-[Ankstesnė data]

Naudodamas antrinėje užklausoje apibrėžtą ankstesnės datos reikšmę, šis reiškinys apskaičiuoja intervalą tarp visų to produkto užsakymų datų ir ankstesnio užsakymo datą.

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

    1. Vykdoma užklausa ir pateikiamas produktų pavadinimų, užsakymų datų, ankstesnių užsakymų datų ir intervalų tarp užsakymų datų sąrašas. Rezultatai pirmiausia rikiuojami pagal produkto ID (didėjimo tvarka), o tada pagal užsakymo datą (mažėjimo tvarka).

    2. Pastaba : Produkto ID yra peržvalgos laukas, todėl pagal numatytuosius nustatymus „Access“ rodo peržvalgos reikšmes (šiuo atveju produkto pavadinimą), o ne faktinius produkto ID. Taip pakeičiamos rodomos reikšmės, tačiau rikiavimo tvarka nepakinta.

  2. Uždarykite „Northwind“ duomenų bazę.

Puslapio viršus

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

Antrinę užklausą galite naudoti kaip lauko kriterijai. Naudokite antrinę užklausą kaip lauko kriterijų, jei norite, kad pagal antrinės užklausos rezultatus būtų ribojamos lauke rodomos reikšmės.

Pvz., tarkim, norite peržiūrėti užsakymų, kuriuos apdorojo pardavimo atstovais nesantys darbuotojai, sąrašą. Norint sugeneruoti šį sąrašą, kiekviename užsakyme nurodytą darbuotojo ID reikia palyginti su pardavimo atstovais nesančių darbuotojų sąraše nurodytais darbuotojų ID. Norėdami sukurti šį sąrašą ir naudoti jį kaip lauko kriterijų, turite naudoti antrinę užklausą, kaip nurodyta toliau pateiktoje procedūroje:

  1. Atidarykite Northwind 2007.accdb ir įjunkite jo turinį.

  2. Uždarykite prisijungimo formą.

  3. Skirtuko Sukurti grupėje Kiti spustelėkite Užklausos dizainas.

  4. Dialogo lango Lentelės rodymas skirtuke Lentelės dukart spustelėkite Užsakymai ir Darbuotojai.

  5. Uždarykite dialogo langą Lentelės rodymas.

  6. Lentelėje Užsakymai dukart spustelėkite laukus Darbuotojo ID, Užsakymo ID ir Užsakymo data, kad jie būtų įtraukti į užklausos dizaino tinklelį. Lentelėje Darbuotojai dukart spustelėkite lauką Pareigos, kad jis būtų įtrauktas į dizaino tinklelį.

  7. Stulpelyje Darbuotojo ID dešiniuoju palės mygtuku spustelėkite eilutę Kriterijai, o tada kontekstiniame meniu spustelėkite Mastelio keitimas.

  8. Lauke Mastelio keitimas įveskite arba įklijuokite šį reiškinį:

    IN (SELECT [ID] FROM [Darbuotojai] 
    WHERE [Pareigos]<>'Pardavimo atstovas')

    Tai yra antrinė užklausa. Ji išrenka visų darbuotojų, kurių pareigos nėra Pardavimo atstovas, ID ir pateikia šį rezultatų rinkinį pagrindinėje užklausoje. Pagrindinė užklausa patikrina, ar rezultatų rinkinyje pateikti lentelėje Užsakymai esantys darbuotojų ID.

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

    Užklausa įvykdoma ir kaip jos rezultatai pateikiamas užsakymų, kuriuos apdorojo pardavimo atstovais nesantys darbuotojai, sąrašas.

Puslapio viršus

Įprasti SQL raktažodžiai, kuriuos galima naudoti antrinėje užklausoje

Yra keletas SQL raktažodžių, kuriuos galite naudoti antrinėje užklausoje.

Pastaba : Šis sąrašas nėra baigtinis. Antrinėje užklausoje galite naudoti bet kurį tinkamą SQL raktažodį, išskyrus duomenis apibrėžiančius raktažodžius.

  • ALL    Naudokite ALL sąlygoje WHERE, kad būtų nuskaitytos sąlygą tenkinančios eilutės, palyginus su kiekviena antrinėje užklausa pateikta eilute.

Pvz., tarkim, analizuojate studentų duomenis koledže. Studentai turi išlaikyti minimalų GPA, bet aukščiausieji įvertinimai yra skirtingi. Aukščiausieji įvertinimai ir jų minimalūs GPA saugomi lentelėje, kurios pavadinimas Aukščiausieji įvertinimai, o susijusi studentų informacija saugoma lentelėje, kurios pavadinimas Studentų įrašai.

Norėdami peržiūrėti aukščiausiųjų įvertinimų (ir su jais susijusių minimalių GPA), kuriuos turintys studentai viršija minimalų GPA, sąrašą, galite naudoti šią užklausą:

SELECT [Aukščiausieji įvertinimai], [Minimalus GPA] 
FROM [Aukščiausieji įvertinimai]
WHERE [Minimalus GPA] < ALL
(SELECT [GPA] FROM [Studentų įrašai]
WHERE [Studentų įrašai].[Aukščiausieji įvertinimai]=[Aukščiausieji įvertinimai].[Aukščiausieji įvertinimai]);
  • ANY    Naudokite ANY sąlygoje WHERE, kad būtų nuskaitytos sąlygą tenkinančios eilutės, palyginus su bent viena antrinėje užklausoje pateikta eilute.

    Pvz., tarkim, analizuojate studentų duomenis koledže. Studentai turi išlaikyti minimalų GPA, bet aukščiausieji įvertinimai yra skirtingi. Aukščiausieji įvertinimai ir jų minimalūs GPA saugomi lentelėje, kurios pavadinimas Aukščiausieji įvertinimai, o susijusi studentų informacija saugoma lentelėje, kurios pavadinimas Studentų įrašai.

    Norėdami peržiūrėti aukščiausiųjų įvertinimų (ir su jais susijusių minimalių GPA), kuriuos turintis studentas neatitinka minimalaus GPA, sąrašą, galite naudoti šią užklausą:

    SELECT [Aukščiausieji įvertinimai], [Minimalus GPA] 
    FROM [Aukščiausieji įvertinimai]
    WHERE [Minimalus GPA] > ANY
    (SELECT [GPA] FROM [Studentų įrašai]
    WHERE [Studentų įrašai].[Aukščiausieji įvertinimai]=[Aukščiausieji įvertinimai].[Aukščiausieji įvertinimai]);

    Pastaba : Kartais galite naudoti raktažodį SOME; raktažodis SOME yra ANY sinonimas.

  • EXISTS    Naudokite EXISTS sąlygoje WHERE, norėdami nurodyti, kad antrinė užklausa turi pateikti bent vieną eilutę. Be to, prieš EXISTS pridėję NOT nurodysite, kad antrinė užklausa neturi pateikti nė vienos eilutės.

    Pvz., ši užklausa pateikia produktų, rastų bent viename esamame užsakyme, sąrašą:

    SELECT *
    FROM [Produktai]
    WHERE EXISTS
    (SELECT * FROM [Užsakymo išsami informacija]
    WHERE [Užsakymo išsami informacija].[Produkto ID]=[Produktai].[ID]);

    Naudojant NOT EXISTS užklausa grąžins produktų, kurių nepavyko rasti bent viename esamame užsakyme, sąrašą:

    SELECT *
    FROM [Produktai]
    WHERE NOT EXISTS
    (SELECT * FROM [Užsakymo išsami informacija]
    WHERE [Užsakymo išsami informacija].[Produkto ID]=[Produktai].[ID]);
  • IN    Naudokite IN sąlygoje WHERE, kad būtų patvirtinta, jog dabartinėje pagrindinės užklausos eilutėje pateikta reikšmė yra įtraukta į antrinės užklausos pateiktą rinkinį. Be to, prieš IN pridėjus NOT bus patvirtinta, jog dabartinėje pagrindinės užklausos eilutėje pateikta reikšmė nėra įtraukta į antrinės užklausos pateiktą rinkinį.

    Pvz., ši užklausa grąžins užsakymų (ir užsakymų datų), kuriuos apdorojo pardavimo atstovais nesantys darbuotojai, sąrašą:

    SELECT [Užsakymo ID], [Užsakymo data]
    FROM [Užsakymai]
    WHERE [Darbuotojo ID] IN
    (SELECT [ID] FROM [Darbuotojai]
    WHERE [Pareigos]<>'Pardavimo atstovas');

    Naudodami NOT IN tą pačią užklausą galite rašyti taip:

    SELECT [Užsakymo ID], [Užsakymo data]
    FROM [Užsakymai]
    WHERE [Darbuotojo ID] NOT IN
    (SELECT [ID] FROM [Darbuotojai]
    WHERE [Pareigos]='Pardavimo atstovas');

Puslapio viršus

Tobulinkite savo įgūdžius
Ieškoti mokymo
Pirmiausia gaukite naujų funkcijų
Prisijunkite prie „Office Insider“ dalyvių

Ar ši informacija buvo naudinga?

Dėkojame už jūsų atsiliepimus!

Dėkojame už jūsų atsiliepimą! Panašu, kad gali būti naudinga jus sujungti su vienu iš mūsų „Office“ palaikymo agentų.

×