Ponekad rezultate upita možda želite koristiti kao polje u drugom upitu ili kao kriterij za polje upita. Pretpostavimo, primjerice, da želite vidjeti vremenski razmak između narudžbi za svaki proizvod. Da biste stvorili upit koji pokazuje taj interval, morate svaki datum narudžbe usporediti s drugim datumima narudžbe za taj proizvod. Za usporedbu tih datuma narudžbe potreban je i upit. Taj upit možete ugnijezditi u glavni upit pomoću podupita.
Podupit možete napisati u izrazu ili naredbi Structured Query Language (SQL) u SQL prikazu.
Sadržaj članka
- Korištenje rezultata upita kao polja u drugom upitu
- Korištenje podupita kao kriterija za polje upita
- Uobičajene SQL ključne riječi koje se mogu koristiti s podupitima
Korištenje rezultata upita kao polja u drugom upitu
Kao pseudonim polja možete koristiti podupit. Podupit koristite kao pseudonim polja kada rezultate podupita želite koristiti kao polje u glavnom upitu.
Napomena
Podupit koji koristite kao pseudonim polja ne može vratiti više od jednog polja.
Pseudonim polja podupita možete koristiti za prikaz vrijednosti koje ovise o drugim vrijednostima u trenutnom retku, što nije moguće bez podupita.
Vratimo se, primjerice, na primjer u kojem želite vidjeti interval između narudžbi za svaki proizvod. Da biste odredili taj interval, morate svaki datum narudžbe usporediti s drugim datumima narudžbe za taj proizvod. Pomoću predloška baze podataka Northwind možete stvoriti upit koji prikazuje te podatke.
Na kartici Datoteka kliknite Novo.
U odjeljku Dostupni predlošci kliknite Ogledni predlošci.
Kliknite Northwind, a zatim Stvori.
Slijedite upute na stranici Northwind Traders (na kartici objekta Početni zaslon) da biste otvorili bazu podataka, a zatim zatvorite prozor dijaloškog okvira za prijavu.
Na kartici Stvaranje u grupi Upiti kliknite Dizajn upita.
Kliknite karticu Upiti pa dvokliknite Narudžbe proizvoda.
Dvokliknite polja ID proizvoda i polja Datum narudžbe da biste ih dodali u rešetku dizajna upita.
U retku Sortiranje stupca ID proizvoda u rešetki odaberite Uzlazno.
U retku Sortiranje stupca Datum narudžbe u rešetki odaberite Silazno.
U trećem stupcu rešetke desnom tipkom miša kliknite redak Polje , a zatim na izborniku prečaca kliknite Zumiranje .
U dijaloškom okviru Zumiranje upišite ili zalijepite sljedeći izraz:
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])Taj je izraz podupit. Za svaki redak podupit odabire najnoviji datum narudžbe koji je sporiji od datuma narudžbe koji je već povezan s retkom. Obratite pozornost na to kako koristite ključnu riječ AS da biste stvorili pseudonim tablice da biste vrijednosti u podupitu mogli usporediti s vrijednostima u trenutnom retku glavnog upita.
U četvrti stupac rešetke u redak Polje upišite sljedeći izraz:
Interval: [Order Date]-[Prior Date]
Ovaj izraz izračunava interval između datuma narudžbe i datuma prethodne narudžbe za taj proizvod, koristeći vrijednost prethodnog datuma koju smo definirali pomoću podupita.Na kartici Dizajn u grupi Rezultati kliknite Izvedi.
- Pokrenut će se upit i prikazati popis naziva proizvoda, datuma narudžbe, datuma prethodnih narudžbi te intervala između datuma narudžbe. Rezultati se najprije sortiraju po ID-u proizvoda (uzlazno), a zatim po datumu narudžbe (silaznim redoslijedom).
-
Napomena
Budući da je ID proizvoda polje s vrijednostima, Access prema zadanim postavkama prikazuje tražene vrijednosti (u ovom slučaju naziv proizvoda), a ne stvarne ID-ove proizvoda. Premda se time mijenjaju vrijednosti koje se prikazuju, ne mijenja se redoslijed sortiranja.
Zatvorite bazu podataka tvrtke Northwind.
Korištenje podupita kao kriterija za polje upita
Kao kriterij polja možete koristiti podupit. Podupit kao kriterij polja koristite kada želite koristiti rezultate podupita radi ograničavanja vrijednosti koje polje prikazuje.
Pretpostavimo, primjerice, da želite pregledati popis narudžbi koje su obradili zaposlenici koji nisu prodajni predstavnici. Da biste generirali taj popis, morate usporediti ID zaposlenika za svaku narudžbu s popisom ID-ova zaposlenika za zaposlenike koji nisu prodajni predstavnici. Da biste stvorili taj popis i koristili ga kao kriterij polja, koristite podupit, kao što je prikazano u sljedećem postupku:
Otvorite datoteku Northwind.accdb i omogućite njezin sadržaj.
Zatvorite obrazac za prijavu.
Na kartici Stvaranje u grupi Ostalo kliknite Dizajn upita.
Na kartici Tablice dvokliknite Narudžbe i Zaposlenici.
U tablici Narudžbe dvokliknite polje ID zaposlenika , ID narudžbe i polje Datum narudžbe da biste ih dodali u rešetku dizajna upita. U tablici Zaposlenici dvokliknite polje Naziv radnog mjesta da biste ga dodali u rešetku dizajna.
Desnom tipkom miša kliknite redak Kriteriji stupca ID zaposlenika, a zatim na izborničkom prečacu kliknite Zumiranje .
U okvir Zumiranje upišite ili zalijepite sljedeći izraz:
IN (SELECT [ID] FROM [Employees] WHERE [Job Title]<>'Sales Representative')Ovo je podupit. Ono odabire sve ID-ove zaposlenika za koje zaposlenik nema radno mjesto prodajnog predstavnika i taj skup rezultata šalje u glavni upit. Glavni upit zatim provjerava jesu li ID-ovi zaposlenika iz tablice Narudžbe u skupu rezultata.
Na kartici Dizajn u grupi Rezultati kliknite Izvedi.
Upit će se pokrenuti, a rezultati upita prikazat će popis narudžbi koje su obradili zaposlenici koji nisu prodajni predstavnici.
Uobičajene SQL ključne riječi koje se mogu koristiti s podupitima
Postoji nekoliko SQL ključnih riječi koje možete koristiti s podupitom:
Napomena
Ovaj popis nije konačan. U podupitu možete koristiti bilo koju valjanu SQL ključnu riječ, osim ključnih riječi definicije podataka.
SVE Koristite uvjet ALL u uvjetu WHERE da biste dohvatili retke koji zadovoljavaju uvjet u odnosu na svaki redak koji je vratio podupit.
Na primjer, pretpostavimo da analizirate podatke o studentima na fakultetu. Studenti moraju održavati minimalni prosjek ocjena, koji varira od predmeta do predmeta. Glavni predmeti i njihovi minimalni prosjeki ocjena pohranjuju se u tablicu pod nazivom Glavni predmeti, a relevantni podaci o studentu pohranjuju se u tablicu naziva Student_Records.
Da biste pogledali popis glavnih predmeta (i njihove minimalne prosjeke ocjena) za koje svaki student s tim smjerom premašuje minimalni prosjek ocjena, možete upotrijebiti sljedeći upit:SELECT [Major], [Min_GPA] FROM [Majors] WHERE [Min_GPA] < ALL (SELECT [GPA] FROM [Student_Records] WHERE [Student_Records].[Major]=[Majors].[Major]);BILO KOJI Koristite ANY u uvjetu WHERE da biste dohvatili retke koji zadovoljavaju uvjet u usporedbi s barem jednim retkom koje je vratio podupit.
Na primjer, pretpostavimo da analizirate podatke o studentima na fakultetu. Studenti moraju održavati minimalni prosjek ocjena, koji varira od predmeta do predmeta. Glavni predmeti i njihovi minimalni prosjeki ocjena pohranjuju se u tablicu pod nazivom Glavni predmeti, a relevantni podaci o studentu pohranjuju se u tablicu naziva Student_Records.
Da biste vidjeli popis glavnih predmeta (i njihove minimalne prosjeke ocjena) za koje student s tim glavnim predmetom ne ispunjava minimalni prosjek ocjena, možete upotrijebiti sljedeći upit:SELECT [Major], [Min_GPA] FROM [Majors] WHERE [Min_GPA] > ANY (SELECT [GPA] FROM [Student_Records] WHERE [Student_Records].[Major]=[Majors].[Major]);Napomena
U istu svrhu možete koristiti i ključnu riječ SOME Ključna riječ SOME sinonim je za ANY.
POSTOJI Koristite EXISTS u uvjetu WHERE da biste naznačili da podupit mora vratiti barem jedan redak. Možete i unaprijed reći POSTOJI s NOT da biste naznačili da podupit ne smije vraćati retke.
Sljedeći upit, na primjer, vraća popis proizvoda koji su pronađeni u barem jednoj postojećoj narudžbi:SELECT * FROM [Products] WHERE EXISTS (SELECT * FROM [Order Details] WHERE [Order Details].[Product ID]=[Products].[ID]);Pomoću argumenta NOT EXISTS upit vraća popis proizvoda koji nisu pronađeni u barem jednoj postojećoj narudžbi:
SELECT * FROM [Products] WHERE NOT EXISTS (SELECT * FROM [Order Details] WHERE [Order Details].[Product ID]=[Products].[ID]);U ODJELJKU Koristite IN u uvjetu WHERE da biste potvrdili je li vrijednost u trenutnom retku glavnog upita dio skupa koji vraća podupit. Možete i unaprijed dodati NO da biste provjerili nije li vrijednost u trenutnom retku glavnog upita dio skupa koji vraća podupit.
Na primjer, sljedeći upit vraća popis narudžbi (s datumima narudžbe) koje su obradili zaposlenici koji nisu prodajni predstavnici:SELECT [Order ID], [Order Date] FROM [Orders] WHERE [Employee ID] IN (SELECT [ID] FROM [Employees] WHERE [Job Title]<>'Sales Representative');Pomoću funkcije NOT In isti upit možete napisati na sljedeći način:
SELECT [Order ID], [Order Date] FROM [Orders] WHERE [Employee ID] NOT IN (SELECT [ID] FROM [Employees] WHERE [Job Title]='Sales Representative');