Până acum, am obținut date din baza de date folosind interogări simple și o singură instrucțiune SELECT. Cu toate acestea, mai des, va trebui să selectăm date care îndeplinesc multe condiții și aici nu ne putem lipsi de interogări avansate. Pentru aceasta, în SQL există subinterogări sau interogări imbricate, unde o instrucțiune SELECT este imbricată în alta.
O subinterogare este o instrucțiune SELECT imbricată într-un alt SELECT, SELECT...INTO, INSERT...INTO, DELETE, UPDATE sau în interiorul unei alte subinterogări.
Textul subinterogării trebuie să fie cuprins între paranteze. Subinterogările sunt adesea folosite în loc de unirea tabelelor (JOIN).
Tabelele de baze de date utilizate în DBMS Access sunt tabele relaționale, adică toate tabelele pot fi legate între ele prin câmpuri comune. Să presupunem că stocăm date în două tabele diferite și trebuie să selectăm datele într-unul dintre ele, în funcție de ce date sunt în celălalt. Pentru aceasta, vom crea un alt tabel în baza noastră de date. Acesta va fi, de exemplu, tabelul Sellers cu informații despre furnizori:
Acum avem două tabele - Sumproduct și Sellers care au același câmp City. Să presupunem că trebuie să numărăm câte produse au fost vândute numai în Canada. Subinterogările ne vor ajuta să facem acest lucru. Deci, mai întâi, să scriem o interogare pentru un eșantion de orașe situate în Canada:
Run SQLSELECT City
FROM Sellers
WHERE Country = 'Canada'
Acum să transmitem aceste date la următoarea interogare, care va selecta datele din tabelul Sumproduct:
Run SQLSELECT SUM(Quantity) AS Qty_Canada
FROM Sumproduct
WHERE City IN ('Montreal','Toronto')
De asemenea, putem combina aceste două solicitări într-una singură. Astfel, o solicitare care scoate date va fi cea principală, iar a doua cerere care transferă datele de intrare va fi auxiliară (sub-interogare). Pentru a insera o subinterogare, vom folosi construcția WHERE ... IN (...), care a fost discutată în secțiunea Filtrare avansată:
Run SQLSELECT SUM(Quantity) AS Qty_Canada
FROM Sumproduct
WHERE City IN (SELECT City
FROM Sellers
WHERE Country = 'Canada')
Putem vedea că am obținut aceleași date ca și cu două interogări separate. În același mod, putem crește adâncimea de imbricare a interogărilor prin imbricarea subinterogărilor de câte ori dorim.
De asemenea, putem folosi subinterogări ca câmpuri calculate. Să afișăm, de exemplu, numărul de produse vândute pentru fiecare vânzător folosind următoarea interogare:
Run SQLSELECT Seller_name, (SELECT SUM(Quantity)
FROM Sumproduct
WHERE Sellers.City = Sumproduct.City) AS Qty
FROM Sellers
Prima instrucțiune SELECT afișează două coloane - Seller_name și Qty. Câmpul Qty este calculat, este format ca urmare a execuției subinterogării, care este cuprinsă între paranteze rotunde. Această subinterogare este executată o dată pentru fiecare înregistrare în câmpul Seller_name și va fi executată de patru ori în total, deoarece sunt selectate patru nume de vânzător.
De asemenea, în subinterogare, clauza WHERE îndeplinește funcția de join, deoarece cu ajutorul lui WHERE am unit cele două tabele prin câmpul City, folosind numele complete ale coloanelor (Table.Field).