Imbricarea unei interogări în altă interogare sau într-o expresie utilizând o subinterogare

Uneori, poate doriți să utilizați rezultatele unei interogări ca un câmp în altă interogare sau ca un criteriu pentru un câmp de interogare. De exemplu, să presupunem că doriți să vedeți intervalul dintre comenzi pentru fiecare produs. Pentru a crea o interogare care să arate acest interval, trebuie să comparați fiecare dată de comandă cu alte date de comandă pentru acel produs. Compararea acestor date de comandă necesită, de asemenea, o interogare. Aveți posibilitatea să imbricați această interogare în interogarea dvs. principală, utilizând o subinterogare.

Aveți posibilitatea să scrieți o subinterogare într-o expresie sau într-o instrucțiune SQL (Limbaj de interogare structurat) în Vizualizare SQL.

În acest articol

Utilizarea rezultatelor unei interogări ca un câmp în altă interogare

Utilizarea unei subinterogări ca un criteriu pentru un câmp de interogare

Cuvinte cheie SQL comune care se pot utiliza într-o subinterogare

Utilizarea rezultatelor unei interogări ca un câmp în altă interogare

Aveți posibilitatea să utilizați o subinterogare ca un alias (SQL) câmp. Utilizați o subinterogare ca un alias câmp când doriți să utilizați rezultatele subinterogării ca un câmp din interogarea principală.

Notă : O subinterogare pe care o utilizați ca un alias câmp nu poate returna mai mult de un câmp.

Aveți posibilitatea să utilizați un alias câmp de subinterogare pentru a afișa valori care depind de alte valori din rândul curent, ceea ce nu este posibil fără a utiliza o subinterogare.

De exemplu, să revenim la exemplul în care doriți să vedeți intervalul dintre comenzi pentru fiecare produs. Pentru a determina acest interval, trebuie să comparați fiecare dată de comandă cu alte date de comandă pentru acel produs. Aveți posibilitatea să creați o interogare care să afișeze aceste informații utilizând șablonul de bază de date Northwind.

Cum se configurează Northwind

  1. Pe fila Fișier, faceți clic pe Nou.

  2. Sub Șabloane disponibile, faceți clic pe Șabloane eșantion.

  3. Faceți clic pe Northwind, apoi pe Creare.

  4. Urmați instrucțiunile de la pagina Northwind Traders (pe fila obiect Ecran de lansare în execuție) pentru a deschide baza de date, apoi închideți fereastra de dialog Login

  1. În fila Creare, în grupul Interogări, faceți clic pe Proiectare interogare.

  2. În caseta de dialog Afișare tabel faceți clic pe fila Interogări, apoi faceți dublu clic pe Comenzi produs.

  3. Închideți caseta de dialog Afișare tabel.

  4. Faceți dublu clic pe câmpul ID produs și pe câmpul Dată comandă pentru a le adăuga la grila de proiectare a interogării.

  5. În rândul Sortare al coloanei ID produs a grilei, selectați Ascendent.

  6. În rândul Sortare al coloanei Dată comandă a grilei, selectați Descendent.

  7. În a treia coloană a grilei, faceți clic cu butonul din dreapta pe rândul Câmp, apoi faceți clic pe Zoom în meniul de comenzi rapide.

  8. În caseta de dialog Zoom, tastați sau lipiți următoarea expresie:

    Dată anterioară: (SELECT MAX([Dată comandă]) 
    FROM [Comenzi produs] AS [Comenzi vechi]
    WHERE [Comenzi vechi].[Dată comandă] < [Comenzi produs].[Dată comandă]
    AND [Comenzi vechi].[ID produs] = [Comenzi produs].[ID produs])

Această expresie este subinterogarea. Pentru fiecare rând, subinterogarea selectează cea mai recentă dată de comandă care este imediat anterioară datei de comandă deja asociată cu rândul. Rețineți să utilizați cuvântul cheie AS pentru a crea un alias tabel, astfel încât să comparați valori din subinterogare cu valori din rândul curent al interogării principale.

  1. În a patra coloană a grilei, în rândul Câmp, tastați următoarea expresie:

    Interval: [Dată comandă]-[Dată anterioară]

Această expresie calculează intervalul dintre fiecare dată de comandă și data anterioară de comandă pentru acel produs, utilizând valoarea pentru data anterioară pe care am definit-o utilizând o subinterogare.

  1. În fila Proiect, în grupul Rezultate, faceți clic pe Executare.

    1. Interogarea se execută și afișează o listă de nume de produse, date de comandă, date de comandă anterioare și intervalul dintre datele de comandă. Rezultatele sunt sortate mai întâi după ID produs (în ordine ascendentă), apoi după Dată comandă (în ordine descendentă).

    2. Notă : Deoarece ID produs este un câmp de căutare, Access afișează în mod implicit valorile de căutare (în acest caz, numele produsului), nu ID-urile reale ale produselor. Deși aceasta modifică modul în care apar valorile, nu modifică ordinea de sortare.

  2. Închideți baza de date Northwind.

Începutul paginii

Utilizarea unei subinterogări ca un criteriu pentru un câmp de interogare

Aveți posibilitatea să utilizați o subinterogare ca un criterii câmp. Utilizați o subinterogare ca un criteriu câmp când doriți să utilizați rezultatele subinterogării pentru a limita valorile afișate de câmp.

De exemplu, să presupunem că doriți să revizuiți o listă de comenzi care au fost procesate de angajați care nu sunt reprezentanți de vânzări. Pentru a genera această listă, trebuie să comparați ID-urile de angajat pentru fiecare comandă cu o listă de ID-uri de angajat pentru angajații care nu sunt reprezentanți de vânzări. Pentru a crea această listă și a o utiliza ca un criteriu de câmp, utilizați o subinterogare, așa cum se arată în următoarea procedură:

  1. Deschideți Northwind 2007.accdb și activați conținutul acesteia.

  2. Închideți formularul de Login.

  3. În fila Creare, în grupul Altele, faceți clic pe Proiectare interogare.

  4. În caseta de dialog Afișare tabel, pe fila Tabele, faceți dublu clic pe Comenzi și pe Angajați.

  5. Închideți caseta de dialog Afișare tabel.

  6. În tabelul Comenzi, faceți dublu clic pe câmpul ID angajat, pe câmpul ID comandă și pe câmpul Dată comandă pentru a le adăuga la grila de proiectare a interogării. În tabelul Angajați, faceți dublu clic pe câmpul Ocupație pentru a-l adăuga la grila de proiectare.

  7. Faceți clic cu butonul din dreapta pe rândul Criterii al coloanei ID angajat, apoi faceți clic pe Zoom din meniul de comenzi rapide.

  8. În caseta Zoom, tastați sau lipiți următoarea expresie:

    IN (SELECT [ID] FROM [Angajați] 
    WHERE [Ocupație]<>'Reprezentant de vânzări')

    Aceasta este subinterogarea. Ea selectează toate ID-urile de angajat unde angajatul nu are ca ocupație Reprezentant de vânzări și furnizează acest set de rezultate interogării principale. Interogarea principală verifică apoi dacă ID-urile de angajat din tabelul Comenzi sunt în setul de rezultate.

  9. În fila Proiect, în grupul Rezultate, faceți clic pe Executare.

    Interogarea se execută, iar rezultatele interogării afișează o listă de comenzi care au fost procesate de angajați care nu sunt reprezentanți de vânzări.

Începutul paginii

Cuvinte cheie SQL comune care se pot utiliza într-o subinterogare

Există câteva cuvinte cheie SQL care se pot utiliza într-o subinterogare:

Notă : Această listă nu este exhaustivă. Aveți posibilitatea să utilizați orice cuvânt cheie SQL valid într-o subinterogare, în afară de cuvinte cheie de definiție de date.

  • ALL    Utilizați ALL într-o clauză WHERE pentru a regăsi rândurile care satisfac o condiție la compararea cu fiecare rând returnat de subinterogare.

De exemplu, să presupunem că analizați date despre elevii de la un colegiu. Elevii trebuie să aibă o medie minimă, care variază după tipul de examen de bacalaureat. Examenele de bacalaureat și mediile lor minime sunt stocate într-un tabel denumit Bacalaureate și informațiile relevante despre elevi sunt stocate într-un tabel denumit Înregistrări_elevi.

Pentru a vedea o listă de examene de bacalaureat (și mediile lor minime) pentru care fiecare student are nota la examen mai mare decât media minimă, utilizați următoarea interogare:

SELECT [Bacalaureat], [Medie_min] 
FROM [Bacalaureate]
WHERE [Medie_min] < ALL
(SELECT [Medie] FROM [Înregistrări_elevi]
WHERE [Înregistrări_elevi].[Bacalaureat]=[Bacalaureate].[Bacalaureat]);
  • ANY    Utilizați ANY într-o clauză WHERE pentru a regăsi rândurile care satisfac o condiție la compararea cu cel puțin unul dintre rândurile returnate de subinterogare.

    De exemplu, să presupunem că analizați date despre elevii de la un colegiu. Elevii trebuie să aibă o medie minimă, care variază după tipul de examen de bacalaureat. Examenele de bacalaureat și mediile lor minime sunt stocate într-un tabel denumit Bacalaureate și informațiile relevante despre elevi sunt stocate într-un tabel denumit Înregistrări_elevi.

    Pentru a vedea o listă de examene de bacalaureat (și mediile lor minime) pentru care un student are nota la examen mai mică decât media minimă, utilizați următoarea interogare:

    SELECT [Bacalaureat], [Medie_min] 
    FROM [Bacalaureate]
    WHERE [Medie_min] > ANY
    (SELECT [Medie] FROM [Înregistrări_elevi]
    WHERE [Înregistrări_elevi].[Bacalaureat]=[Bacalaureate].[Bacalaureat]);

    Notă : De asemenea, se poate utiliza cuvântul cheie SOME pentru același scop; cuvântul cheie SOME este sinonim cu ANY.

  • EXISTS    Utilizați EXISTS într-o clauză WHERE pentru a indica faptul că o interogare ar trebui să returneze cel puțin un rând. EXISTS poate fi precedat de NOT, pentru a indica faptul că o interogare nu ar trebui să returneze niciun rând.

    De exemplu, următoarea interogare returnează o listă de produse care se găsesc în cel puțin una dintre comenzile existente:

    SELECT *
    FROM [Produse]
    WHERE EXISTS
    (SELECT * FROM [Detalii comenzi]
    WHERE [Detalii comenzi].[ID produs]=[Produse].[ID]);

    Utilizând NOT EXISTS, interogarea returnează o listă de produse care nu se găsesc în niciuna dintre comenzile existente:

    SELECT *
    FROM [Produse]
    WHERE NOT EXISTS
    (SELECT * FROM [Detalii comenzi]
    WHERE [Detalii comenzi].[ID produs]=[Produse].[ID]);
  • IN    Utilizați IN într-o clauză WHERE pentru a verifica dacă o valoare din rândul curent al interogării principale face parte din setul returnat de subinterogare. IN poate fi precedat de NOT, pentru a verifica dacă o valoare din rândul curent al interogării principale nu face parte din setul returnat de subinterogare.

    De exemplu, următoarea interogare returnează o listă de comenzi (cu date ale comenzilor) care au fost procesate de angajați care nu sunt reprezentanți de vânzări:

    SELECT [ID comandă], [Dată comandă]
    FROM [Comenzi]
    WHERE [ID angajat] IN
    (SELECT [ID] FROM [Angajați]
    WHERE [Ocupație]<>'Reprezentant de vânzări');

    Utilizând NOT IN, scrieți aceeași interogare astfel:

    SELECT [ID comandă], [Dată comandă]
    FROM [Comenzi]
    WHERE [ID angajat] NOT IN
    (SELECT [ID] FROM [Angajați]
    WHERE [Ocupație]='Reprezentant de vânzări');

Începutul paginii

Extindeți-vă competențele
Explorați instruirea
Fiți primul care obține noile caracteristici
Alăturați-vă utilizatorilor Office Insider

Au fost utile aceste informații?

Vă mulțumim pentru feedback!

Vă mulțumim pentru feedback! Se pare că ar fi util să luați legătura cu unul dintre agenții noștri de asistență Office.

×