Uneori, poate doriți să utilizați rezultatele unei interogări ca un câmp în altă interogare sau drept criteriu pentru un câmp de interogare. De exemplu, să presupunem că doriți să vedeți intervalul dintre comenzi pentru fiecare dintre produsele dvs. Pentru a crea o interogare care afișează acest interval, trebuie să comparați fiecare dată a comenzii cu alte date ale comenzii pentru produsul respectiv. Compararea acestor date de comandă necesită, de asemenea, o interogare. Puteți imbrica această interogare în interogarea principală utilizând un subinterogare.
Puteți să scrieți o subinterogare într-o expresie sau într-o instrucțiune Limbaj de interogare structurat (SQL) într- Vizualizare SQL.
În acest articol
Utilizarea rezultatelor unei interogări ca câmp într-o altă interogare
Puteți utiliza o subinterogare ca alias de câmp. Utilizați o subinterogare ca alias de câmp atunci când doriți să utilizați rezultatele subinterogării ca un câmp în interogarea principală.
Notă: O subinterogare pe care o utilizați ca alias de câmp nu poate returna mai multe câmpuri.
Puteți utiliza un alias de câmp de subinterogare pentru a afișa valorile 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 comenzile pentru fiecare dintre produsele dvs. Pentru a determina acest interval, trebuie să comparați fiecare dată a comenzii cu alte date ale comenzii pentru produsul respectiv. Puteți crea o interogare care afișează aceste informații utilizând șablonul de bază de date Northwind.
-
Pe fila Fișier, faceți clic pe Nou.
-
Sub Șabloane disponibile, faceți clic pe Șabloane eșantion.
-
Faceți clic pe Northwind, apoi faceți clic pe Creare.
-
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 Conectare
-
În fila Creare, în grupul Interogări, faceți clic pe Proiectare interogare.
-
Faceți clic pe fila Interogări , apoi faceți dublu clic pe Comenzi produs.
-
Faceți dublu clic pe câmpul ID produs și pe câmpul Data comenzii pentru a le adăuga la grila de proiectare a interogării.
-
În rândul Sortare din coloana ID produs din grilă, selectați Ascendent.
-
În rândul Sortare din coloana Dată comandă din grilă, selectați Descendent.
-
În a treia coloană a grilei, faceți clic dreapta pe rândul Câmp , apoi faceți clic pe Zoom în meniul de comenzi rapide.
-
În caseta de dialog Zoom , tastați sau lipiți următoarea expresie:
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])Această expresie este subinterogarea. Pentru fiecare rând, subinterogarea selectează cea mai recentă dată a comenzii care este mai puțin recentă decât data comenzii care este asociată deja cu rândul. Rețineți cum utilizați cuvântul cheie AS pentru a crea un alias de tabel, astfel încât să puteți compara valorile din subinterogare cu valorile din rândul curent al interogării principale.
-
În a patra coloană a grilei, în rândul Câmp , tastați următoarea expresie:
Interval: [Order Date]-[Prior Date]
Această expresie calculează intervalul dintre fiecare dată a comenzii și data comenzii anterioare pentru produsul respectiv, utilizând valoarea pentru data anterioară pe care am definit-o utilizând o subinterogare.
-
Pe fila Proiectare, în grupul Rezultate, faceți clic pe Rulare.
-
Interogarea rulează și afișează o listă de nume de produse, date ale comenzilor, date ale comenzilor anterioare și intervalul dintre datele comenzilor. Rezultatele sunt sortate mai întâi după ID produs (în ordine ascendentă), apoi după Data comenzii (în ordine descrescătoare).
-
Notă: Deoarece ID produs este un câmp de căutare, în mod implicit, Access afișează valorile de căutare (în acest caz, numele produsului), nu ID-urile reale de produs. Deși acest lucru modifică valorile care apar, nu modifică ordinea de sortare.
-
-
Închideți baza de date Northwind.
Utilizarea unei subinterogare drept criteriu pentru un câmp de interogare
Puteți utiliza o subinterogare drept criteriu de câmp. Utilizați o subinterogare drept criteriu de câmp atunci când doriți să utilizați rezultatele subinterogării pentru a limita valorile pe care le afișează câmpul.
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 ai vânzărilor. Pentru a genera această listă, trebuie să comparați ID-ul angajatului pentru fiecare comandă cu o listă de ID-uri de angajat pentru angajații care nu sunt reprezentanți ai vânzărilor. Pentru a crea această listă și a o utiliza drept criteriu de câmp, utilizați o subinterogare, așa cum se arată în următoarea procedură:
-
Deschideți Northwind.accdb și activați conținutul său.
-
Închideți formularul de conectare.
-
Pe fila Creare, în grupul Altele, faceți clic pe Proiectare interogare.
-
Pe fila Tabele , faceți dublu clic pe Comenzi și angajați.
-
În tabelul Comenzi, faceți dublu clic pe câmpul ID angajat , pe câmpul ID comandă și pe câmpul Data comenzii pentru a le adăuga la grila de proiectare a interogării. În tabelul Angajați, faceți dublu clic pe câmpul Funcție pentru a-l adăuga la grila de proiectare.
-
Faceți clic dreapta pe rândul Criterii din coloana ID angajat, apoi faceți clic pe Zoom în meniul de comenzi rapide.
-
În caseta Zoom , tastați sau lipiți următoarea expresie:
IN (SELECT [ID] FROM [Employees]
WHERE [Job Title]<>'Sales Representative')Aceasta este subinterogarea. Aceasta selectează toate ID-urile de angajat în care angajatul nu are un funcție de Reprezentant vânzări și furnizează rezultatul setat la interogarea principală. Interogarea principală verifică apoi dacă ID-urile angajaților din tabelul Comenzi sunt în setul de rezultate.
-
Pe fila Proiectare, în grupul Rezultate, faceți clic pe Rulare.
Interogarea rulează, iar rezultatele interogării afișează o listă de comenzi care au fost procesate de angajați care nu sunt reprezentanți ai vânzărilor.
Cuvinte cheie SQL comune pe care le puteți utiliza cu o subinterogare
Există mai multe cuvinte cheie SQL pe care le puteți utiliza cu o subinterogare:
Notă: Această listă nu este completă. Puteți utiliza orice cuvânt cheie SQL valid într-o subinterogare, excluzând cuvintele cheie de definiție a datelor.
-
TOATE Utilizați ALL într-o clauză WHERE pentru a regăsi rândurile care satisfac condiția comparativ cu fiecare rând returnat de subinterogare.
De exemplu, să presupunem că analizați datele elevilor/studenților la un colegiu. Elevii trebuie să mențină un GPA minim, care variază de la majore la majore. Specializările și GPA-urile minime sunt stocate într-un tabel denumit Specializări, iar informațiile relevante despre elevi/studenți sunt stocate într-un tabel numit Student_Records.
Pentru a vedea o listă de specializări (și GPA-urile lor minime) pentru care fiecare elev/student cu acea specializare depășește GPA minim, puteți utiliza următoarea interogare:
SELECT [Major], [Min_GPA]
FROM [Majors]
WHERE [Min_GPA] < ALL
(SELECT [GPA] FROM [Student_Records]
WHERE [Student_Records].[Major]=[Majors].[Major]); -
ORICE Utilizați ANY într-o clauză WHERE pentru a regăsi rândurile care satisfac condiția comparativ cu cel puțin unul dintre rândurile returnate de subinterogare.
De exemplu, să presupunem că analizați datele elevilor/studenților la un colegiu. Elevii trebuie să mențină un GPA minim, care variază de la majore la majore. Specializările și GPA-urile minime sunt stocate într-un tabel denumit Specializări, iar informațiile relevante despre elevi/studenți sunt stocate într-un tabel numit Student_Records.
Pentru a vedea o listă de specializări (și GPA-urile lor minime) pentru care orice elev/student cu specializarea respectivă nu îndeplinește GPA minim, puteți utiliza următoarea interogare:
SELECT [Major], [Min_GPA]
FROM [Majors]
WHERE [Min_GPA] > ANY
(SELECT [GPA] FROM [Student_Records]
WHERE [Student_Records].[Major]=[Majors].[Major]);Notă: De asemenea, puteți utiliza cuvântul cheie SOME în 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 subinterogare ar trebui să returneze cel puțin un rând. De asemenea, puteți prefața EXISTS cu NOT, pentru a indica faptul că o subinterogare nu trebuie să returneze niciun rând.
De exemplu, următoarea interogare returnează o listă de produse care se găsesc în cel puțin o comandă existentă:
SELECT *
FROM [Products]
WHERE EXISTS
(SELECT * FROM [Order Details]
WHERE [Order Details].[Product ID]=[Products].[ID]);Utilizând NOT EXISTS, interogarea returnează o listă de produse care nu se găsesc în cel puțin o comandă existentă:
SELECT *
FROM [Products]
WHERE NOT EXISTS
(SELECT * FROM [Order Details]
WHERE [Order Details].[Product ID]=[Products].[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. De asemenea, puteți prefața IN cu 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 datele comenzii) care au fost procesate de angajați care nu sunt reprezentanți ai vânzărilor:
SELECT [Order ID], [Order Date]
FROM [Orders]
WHERE [Employee ID] IN
(SELECT [ID] FROM [Employees]
WHERE [Job Title]<>'Sales Representative');Utilizând NOT IN, puteți scrie aceeași interogare astfel:
SELECT [Order ID], [Order Date]
FROM [Orders]
WHERE [Employee ID] NOT IN
(SELECT [ID] FROM [Employees]
WHERE [Job Title]='Sales Representative');