Kombiniranje više upita u jedan rezultat pomoću upita s unijom

Kombiniranje više upita u jedan rezultat pomoću upita s unijom

Ponekad želite vidjeti popis zapisa iz jedne tablice ili zajedno sa zapisima iz druge tablice ili više njih te od njih stvoriti jedan skup zapisa, tj. popis svih zapisa iz dvije tablice ili više njih. To je svrha upita s unijom u programu Access.

Da biste dobro razumjeli upite s unijom, najprije se morate upoznati s dizajniranjem osnovnih upita odabiranja u programu Access. Da biste saznali više o dizajniranju upita odabiranja, pročitajte članak Stvaranje jednostavnog upita odabiranja.

Napomena: Sadržaj ovoga članka namijenjen je za baze podataka računalnog programa Access. Upis s unijom ne možete stvoriti u bazama podataka aplikacije Access za web ni u web-aplikacijama za Access.

Proučavanje primjera funkcionalnog upita s unijom

Ako nikad prije niste stvarali upit s unijom, možda bi vam bilo korisno da najprije proučite funkcionalni primjer u predlošku Northwind za Access. Ogledni predložak Northwind možete potražiti na stranici za početak rada s programom Access ili tako da kliknete Datoteka > Novo, a možete ga i izravno preuzeti s ovog mjesta: Ogledni predložak Northwind.

Kada Access otvori bazu podataka Northwind, odbacite obrazac dijaloškog okvira za prijavu koji će se pojaviti, a potom proširite navigacijsko okno. Kliknite pri vrhu navigacijskog okna pa odaberite Vrsta objekta da biste organizirali sve objekte baze podataka prema vrsti. Nakon toga proširite grupu Upiti i vidjet ćete upit pod nazivom Transakcije proizvoda.

Upite s unijom lako ćete razlikovati od drugih objekata upita jer imaju posebnu ikonu s dva preklopljena kruga koji predstavljaju uniju dva skupa:

Snimka zaslona s ikonom upita s unijom u programu Access.

Za razliku od normalnih upita odabiranja i akcijskih upita, tablice u upitu s unijom nisu povezane, što znači da se za sastavljanje i uređivanje upita s unijom ne može koristiti grafički dizajner upita u programu Access. To ćete shvatiti ako otvorite upit s unijom iz navigacijskog okna jer će ga Access otvoriti i rezultate prikazati u prikazu podatkovne tablice. Ispod naredbe Prikazi na kartici Polazno primijetit ćete da mogućnost Prikaz dizajna nije dostupna dok radite s upitima s unijom. Prilikom rada s upitima s unijom moći ćete samo prelaziti iz prikaza podatkovne tablice na SQL prikaz i obrnuto.

Da biste nastavili s proučavanjem ovog primjera upita s unijom, kliknite Polazno > Prikazi > SQL prikaz da biste pogledali SQL sintaksu koja ga definira. Na ovoj slici dodali smo razmake u SQL da biste lakše vidjeli razne dijelove od kojih je upit s unijom sačinjen.

Vaš preglednik ne podržava videozapise. Instalirajte Microsoft Silverlight, Adobe Flash Player ili Internet Explorer 9.

Sad ćemo detaljnije proučiti SQL sintaksu ovog upita s unijom iz baze podataka Northwind:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Prvi i treći dio ove SQL naredbe zapravo su dva upita odabiranja. Ti upiti dohvaćaju dva različita skupa zapisa: jedan iz tablice Narudžbe proizvoda, a drugi iz tablice Kupnje proizvoda.

Drugi dio ove SQL naredbe čini ključna riječ UNION, koja programu Access daje do znanja da će upit objediniti dva skupa zapisa.

Zadnji dio SQL naredbe određuje redoslijed kombiniranih zapisa pomoću naredbe ORDER BY. U ovom primjeru Access će sve zapise poredati prema polju Datum narudžbe silaznim redoslijedom.

Napomena: Upiti s unijom u programu Access uvijek su samo za čitanje, što znači da nijednu vrijednost u prikazu podatkovne tablice ne možete promijeniti.

Stvaranje upita s unijom stvaranjem i kombiniranjem upita odabiranja

Premda upit s unijom možete stvoriti tako da u SQL prikazu izravno upišete SQL sintaksu, vjerojatno će vam biti lakše sastavljati ga od dijelova pomoću upita odabiranja. Potom dijelove SQL naredbe možete kopirati i zalijepiti u kombinirani upit s unijom.

Ako želite preskočiti čitanje postupka i umjesto toga pogledati primjer, prijeđite na sljedeći odjeljak: Pogledajte primjer sastavljanja upita s unijom.

  1. Na kartici Stvaranje u grupi Upiti kliknite Dizajn upita.

  2. U dijaloškom okviru Prikaz tablice dvokliknite tablicu s poljima koja želite uvrstiti. Tablica se dodaje u prozor dizajna upita.

  3. Zatvorite dijaloški okvir Prikaz tablice.

  4. U prozoru dizajna upita dvokliknite svako polje koje želite uvrstiti. Tijekom odabira polja u sve upite odabiranja morate istim redoslijedom dodati isti broj polja. Obratite posebnu pozornost na vrste podataka u tim poljima te provjerite jesu li njihove vrste podataka kompatibilne s vrstama podataka u poljima koja se nalaze na istom položaju u ostalim upitima koje spajate. Ako, primjerice, vaš prvi upit s odabiranjem ima pet polja, od kojih prvo sadrži podatke o datumu/vremenu, provjerite ima li i svaki drugi upit odabiranja koji kombinirate također pet polja, od kojih prvo sadrži podatke o datumu/vremenu i tako dalje.

  5. Ako želite, u polja možete dodati kriterije tako da upišete odgovarajuće izraze u redak Kriteriji rešetke polja.

  6. Kada dodate sva polja i kriterije polja, pokrenite upit odabiranja i pregledajte rezultat. Na kartici Dizajn u grupi Rezultati kliknite Pokreni.

  7. Prebacite upit u prikaz dizajna.

  8. Spremite upit odabiranja i ostavite ga otvorenog.

  9. Ponovite taj postupak za svaki upit odabiranja koji želite spojiti.

Sada kada ste stvorili upite odabiranja, vrijeme je da ih objedinite. U ovom ćete koraku stvoriti upit s unijom tako što ćete kopirati i zalijepiti SQL naredbe.

  1. Na kartici Stvaranje u grupi Upiti kliknite Dizajn upita.

  2. Zatvorite dijaloški okvir Prikaz tablice.

  3. Na kartici Dizajn kliknite Unija u grupi Upit. Access će sakriti prozor za dizajniranje upita i prikazati karticu objekata SQL prikaza. Kartica objekata SQL prikaza trenutno je prazna.

  4. Kliknite karticu prvog upita odabiranja koji želite spojiti u upitu s unijom.

  5. Na kartici Polazno kliknite Prikaz > SQL prikaz.

  6. Kopirajte SQL naredbu upita odabiranja. Kliknite karticu upita s unijom koji ste prethodno počeli stvarati.

  7. Zalijepite SQL naredbu za upit odabiranja na karticu objekta SQL prikaz upita s unijom.

  8. Izbrišite točku sa zarezom koja se nalazi na kraju SQL naredbe upita odabiranja.

  9. Pritisnite Enter da biste pokazivač pomaknuli jedan redak prema dolje, a zatim u novi redak upišite UNION.

  10. Kliknite karticu sljedećeg upita odabiranja koji želite spojiti u upitu s unijom.

  11. Ponavljajte postupak od petog do desetog koraka sve dok u prozor SQL prikaz upita s unijom ne kopirate i zalijepite sve SQL naredbe za upite odabiranja. U posljednjem upitu s unijom ne brišite točku sa zarezom i ne upisujte ništa iza SQL naredbe.

  12. Na kartici Dizajn u grupi Rezultati kliknite Pokreni.

Rezultati upita s unijom pojavit će se u prikazu podatkovne tablice.

Pogledajte primjer sastavljanja upita s unijom

Evo primjera koji možete ponoviti u oglednoj bazi podataka Northwind. Upit s unijom prikuplja imena osoba iz tablice Kupci te ih objedinjuje s imenima osoba iz tablice Dobavljači. Ako želite raditi usporedno s videozapisom, prolazite te korake u svojoj kopiji ogledne baze podataka Northwind.

Vaš preglednik ne podržava videozapise. Instalirajte Microsoft Silverlight, Adobe Flash Player ili Internet Explorer 9.

Za sastavljanje ovog primjera nužni su sljedeći koraci:

  1. Stvorite dva upita odabiranja pod nazivom Upit1 i Upit2 čiji su izvor podataka tablice Kupci odnosno Dobavljači. Polja Ime i Prezime ime koristite kao vrijednosti za prikaz.

  2. Stvorite novi upit pod nazivom Upit3 kojem najprije nećete odrediti izvor podataka. Potom kliknite naredbu Unija na kartici Dizajn da biste upit pretvorili u upit s unijom.

  3. Kopirajte i zalijepite SQL naredbe iz Upita1 i Upita2 u Upit3. Ne zaboravite ukloniti točku sa zarezom koja je viška te dodati ključnu riječ UNION. Potom u prikazu podatkovne tablice možete provjeriti rezultate.

  4. Dodajte uvjet redoslijeda u jedan od upita pa zalijepite naredbu ORDER BY u SQL prikaz upita s unijom. Primijetit ćete da se prilikom dodavanja redoslijeda u upitu s unijom, odnosno Upitu3, uklanjaju najprije točke sa zarezom, a zatim i naziv tablice iz naziva polja.

  5. Konačni SQL koji objedinjuje i sortira imena u ovom primjeru upita s unijom izgleda ovako:

    SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
    FROM Customers
    
    UNION
    
    SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
    FROM Suppliers
    
    ORDER BY [Last Name], [First Name];

Ako ste vješti u pisanju SQL sintakse, možete i sami upisati SQL naredbu za upit s unijom izravno u SQL prikaz. No pristup koji obuhvaća kopiranje i lijepljenje SQL naredbi iz drugih objekata upita mogao bi vam biti koristan. Svaki upit može biti mnogo složeniji od jednostavnih upita odabiranja koje smo koristili u ovom primjeru. Preporučujemo da prije kombiniranja upita u upit s unijom svaki upit zasebno stvorite i pomno testirate. Ako se upit s unijom ne uspije izvesti, možete svaki upit zasebno prilagođavati dok ne uspije pa ponovno sastaviti upit s unijom pomoću ispravljene sintakse.

Pročitajte preostale odjeljke ovog članka da biste saznali dodatne savjete i trikove za korištenje upita s unijom.

U primjeru iz prethodnog odjeljka u kojem se koristi baza podataka Northwind kombinirani su podaci samo iz dviju tablica. No u upitu s unijom jednostavno možete kombinirati tri i više tablica. Ako nadogradimo prethodni primjer, možete, primjerice, dodati imena zaposlenika u rezultat upita. To možete postići tako da dodate treći upit te ga objedinite s prethodnom SQL naredbom dodatnom ključnom riječju UNION, i to ovako:

SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
FROM Customers

UNION

SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers

UNION

SELECT Employees.Company, Employees.[Last Name], Employees.[First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

Kada pogledate rezultat u prikazu podatkovne tablice, svi će zaposlenici biti navedeni zajedno s nazivom tvrtke iz primjera, što i nije vrlo korisno. Ako želite da se u tom polju navodi jeli određena osoba interni zaposlenik, zaposlenik dobavljača ili zaposlenik kupca, umjesto naziva tvrtke možete dodati fiksnu vrijednost. Evo kako bi taj SQL trebao izgledati:

SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers

UNION

SELECT "Supplier" As Employment, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers

UNION

SELECT "In-house" As Employment, Employees.[Last Name], Employees.[First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

Evo kako rezultat izgleda u prikazu podatkovne tablice. Access će prikazati ovih pet oglednih zapisa:

Mjesto rada

Prezime

Ime

Interni

Galić

Lucija

Interni

Grgić

Anja

Dobavljač

Lukić

Jadranko

Kupac

Pavlović

Tihomir

Kupac

Lučić

Joško

Prethodno prikazani upit možete se dodatno skratiti jer Access čita samo nazive polja rezultata iz prvog upita u upitu s unijom. Ovdje ćete vidjeti da smo uklonili rezultat iz drugog i trećeg dijela upita:

SELECT "Customer" As Employment, [Last Name], [First Name]
FROM Customers

UNION

SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers

UNION

SELECT "In-house", [Last Name], [First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

U upitu s unijom programa Access određivanje redoslijeda dopušteno je samo jednom, ali se svaki upit može zasebno filtrirati. Ako dodatno nadogradimo upit s unijom iz prethodnog odjeljka, u ovom ćete primjeru vidjeti da smo svaki upit filtrirali dodavanjem uvjeta WHERE.

SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
WHERE [State/Province] = "UT"

UNION

SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
WHERE [Job Title] = "Sales Manager"

UNION

SELECT "In-house", Employees.[Last Name], Employees.[First Name]
FROM Employees
WHERE City = "Seattle"

ORDER BY [Last Name], [First Name];

Prijeđite na prikaz podatkovne tablice i vidjet ćete rezultate slične ovima:

Mjesto rada

Prezime

Ime

Dobavljač

Ivanović

Sanela

Interni

Galić

Lucija

Kupac

Čeh

Srećko

Interni

Hrvatin

Jasna

Dobavljač

Bošnjak

Klara

Kupac

Matković

Miro

Dobavljač

Stipanov

Roko

Dobavljač

Kolar

Edi

Interni

Vukelić

Gordan

Dobavljač

Crnić

Zorica

Interni

Vlašić

Vjekoslav

Ako su upiti koje želite spojiti u uniju vrlo različiti, možete se naći u situaciji u kojoj polje rezultata treba sadržavati kombinaciju podataka različitih vrsta. U tom će slučaju upit s unijom najčešće rezultate vratiti kao tekst jer ta vrsta podataka može sadržavati i tekst i brojeve.

Da biste shvatili kako to funkcionira, koristit ćemo upit s unijom Transakcije proizvoda iz ogledne baze podataka Northwind. Otvorite oglednu bazu podataka, a zatim upit Transakcije proizvoda u prikazu podatkovne tablice. Posljednjih deset zapisa trebalo bi izgledati slično ovome:

ID proizvoda

Datum narudžbe

Naziv tvrtke

Transakcija

Količina

77

22. 1. 2006.

Dobavljač B

Kupnja

60

80

22. 1. 2006.

Dobavljač D

Kupnja

75

81

22. 1. 2006.

Dobavljač A

Kupnja

125

81

22. 1. 2006.

Dobavljač A

Kupnja

200

7

20. 1. 2006.

Tvrtka D

Prodaja

10

51

20. 1. 2006.

Tvrtka D

Prodaja

10

80

20. 1. 2006.

Tvrtka D

Prodaja

10

34

15. 1. 2006.

Tvrtka AA

Prodaja

100

80

15. 1. 2006.

Tvrtka AA

Prodaja

30

Pretpostavimo da polje Količina želite podijeliti na dva polja: Kupnja i Prodaja. Pretpostavimo i da u polje bez vrijednosti želite umetnuti fiksnu vrijednost nula. Evo kako će izgledati SQL za taj upit s unijom:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC; 

Ako prijeđete na prikaz podatkovne tablice, primijetit ćete da se posljednjih deset zapisa sada prikazuje ovako:

ID proizvoda

Datum narudžbe

Naziv tvrtke

Transakcija

Kupnja

Prodaja

74

22. 1. 2006.

Dobavljač B

Kupnja

20

0

77

22. 1. 2006.

Dobavljač B

Kupnja

60

0

80

22. 1. 2006.

Dobavljač D

Kupnja

75

0

81

22. 1. 2006.

Dobavljač A

Kupnja

125

0

81

22. 1. 2006.

Dobavljač A

Kupnja

200

0

7

20. 1. 2006.

Tvrtka D

Prodaja

0

10

51

20. 1. 2006.

Tvrtka D

Prodaja

0

10

80

20. 1. 2006.

Tvrtka D

Prodaja

0

10

34

15. 1. 2006.

Tvrtka AA

Prodaja

0

100

80

15. 1. 2006.

Tvrtka AA

Prodaja

0

30

Nastavno na taj primjer, što ako želite da polja s nulom budu prazna? Možete izmijeniti SQL tako da se umjesto nule ne prikazuje ništa. Samo dodajte ključnu riječ Null, i to ovako:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

No, kao što ste možda primijetili prilikom prelaska na prikaz podatkovne tablice, sad se prikazuje neočekivan rezultat. U stupcu Kupnja očišćena su sva polja:

ID proizvoda

Datum narudžbe

Naziv tvrtke

Transakcija

Kupnja

Prodaja

74

22. 1. 2006.

Dobavljač B

Kupnja

 

 

77

22. 1. 2006.

Dobavljač B

Kupnja

 

 

80

22. 1. 2006.

Dobavljač D

Kupnja

 

 

81

22. 1. 2006.

Dobavljač A

Kupnja

 

 

81

22. 1. 2006.

Dobavljač A

Kupnja

 

 

7

20. 1. 2006.

Tvrtka D

Prodaja

 

10

51

20. 1. 2006.

Tvrtka D

Prodaja

 

10

80

20. 1. 2006.

Tvrtka D

Prodaja

 

10

34

15. 1. 2006.

Tvrtka AA

Prodaja

 

100

80

15. 1. 2006.

Tvrtka AA

Prodaja

 

30

To se događa zato što Access vrste podataka za ta polja određuje na temelju prvog upita. U ovom primjeru Null nije broj.

Što će se onda dogoditi ako pokušate umetnuti prazan niz za praznu vrijednost polja? SQL za taj pokušaj mogao bi izgledati otprilike ovako:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Kada prijeđete na prikaz podatkovne tablice, vidjet ćete da Access dohvaća vrijednosti za polje Kupnja, ali ih pretvara u tekst. To ćete prepoznati po tome što su poravnate lijevo u prikazu podatkovne tablice. Prazan niz u prvom upitu nije broj, pa zato vidite ove rezultate. Primijetit ćete i da su vrijednosti za polje Prodaja pretvorene u tekst jer zapisi o kupnji sadrže prazan niz.

ID proizvoda

Datum narudžbe

Naziv tvrtke

Transakcija

Kupnja

Prodaja

74

22. 1. 2006.

Dobavljač B

Kupnja

20

 

77

22. 1. 2006.

Dobavljač B

Kupnja

60

 

80

22. 1. 2006.

Dobavljač D

Kupnja

75

 

81

22. 1. 2006.

Dobavljač A

Kupnja

125

 

81

22. 1. 2006.

Dobavljač A

Kupnja

200

 

7

20. 1. 2006.

Tvrtka D

Prodaja

 

10

51

20. 1. 2006.

Tvrtka D

Prodaja

 

10

80

20. 1. 2006.

Tvrtka D

Prodaja

 

10

34

15. 1. 2006.

Tvrtka AA

Prodaja

 

100

80

15. 1. 2006.

Tvrtka AA

Prodaja

 

30

Kako riješiti taj problem?

Rješenje je prisiliti upit da očekuje brojčanu vrijednost polja. To možete postići ovim izrazom:

IIf(False, 0, Null)

Uvjet koji se provjerava, tj. False, nikad neće biti True, stoga će izraz uvijek vratiti vrijednost Null, ali Access svejedno provjerava obje mogućnosti rezultata te odlučuje da je rezultat numerička vrijednost ili vrijednost Null.

Evo kako taj izraz možemo iskoristiti u primjeru na kojem radimo:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Imajte na umu da drugi upit nije potrebno mijenjati.

Ako prijeđete na prikaz podatkovne tablice, sad ćete vidjeti željeni rezultat:

ID proizvoda

Datum narudžbe

Naziv tvrtke

Transakcija

Kupnja

Prodaja

74

22. 1. 2006.

Dobavljač B

Kupnja

20

 

77

22. 1. 2006.

Dobavljač B

Kupnja

60

 

80

22. 1. 2006.

Dobavljač D

Kupnja

75

 

81

22. 1. 2006.

Dobavljač A

Kupnja

125

 

81

22. 1. 2006.

Dobavljač A

Kupnja

200

 

7

20. 1. 2006.

Tvrtka D

Prodaja

 

10

51

20. 1. 2006.

Tvrtka D

Prodaja

 

10

80

20. 1. 2006.

Tvrtka D

Prodaja

 

10

34

15. 1. 2006.

Tvrtka AA

Prodaja

 

100

80

15. 1. 2006.

Tvrtka AA

Prodaja

 

30

Alternativna metoda postizanja istog rezultata obuhvaća dodavanje još jednog upita ispred upita iz ovog upita s unijom:

SELECT 
    0 As [Product ID], Date() As [Order Date], 
    "" As [Company Name], "" As [Transaction], 
    0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False

Access za svako polje vraća fiksne vrijednosti definirane vrste podataka. Ne želite, naravno, da rezultat ovog upita utječe na konačne rezultate, pa to možete izbjeći tako da dodate uvjet WHERE u izraz False:

WHERE False

To je trik za postizanje željenog ishoda jer je ta vrijednost uvijek "False" i upit ne vraća ništa. Kombiniranjem te naredbe s postojećom SQL naredbom dolazimo do sljedeće potpune naredbe:

SELECT 
    0 As [Product ID], Date() As [Order Date], 
    "" As [Company Name], "" As [Transaction], 
    0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False

UNION

SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Napomena: Kombinirani upit iz ovog primjera s bazom podataka Northwind vraća 100 zapisa, a dva pojedinačna upita vraćaju 58 odnosno 43 zapisa, tj. ukupno 101 zapisa. Do te nepodudarnosti dolazi zato što dva zapisa nisu jedinstvena. U odjeljku Rad sa zasebnim upitima u upitima s unijom pomoću ključne riječi UNION ALL potražite dodatne informacije o tome kako taj scenarij riješiti pomoću ključne riječi UNION ALL.

Poseban je slučaj upita s unijom kombiniranje skupa zapisa s jednim zapisom koji sadrži zbroj jednog polja ili više njih.

Evo još jednog primjera koji možete stvoriti u oglednoj bazi podataka Northwind da biste shvatili kako dohvatiti ukupni zbroj u upitu s unijom.

  1. Pomoću sljedeće SQL sintakse stvorite novi jednostavni upit da biste pogledali kupnju piva (ID proizvoda = 34 u bazi podataka Northwind):

    SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    ORDER BY [Purchase Order Details].[Date Received];
  2. Kad prijeđete na prikaz podatkovne tablice, trebali biste vidjeti sljedeće rezultate:

    Datum primitka

    Količina

    22. 1. 2006.

    100

    22. 1. 2006.

    60

    4. 4. 2006.

    50

    5. 4. 2006.

    300

  3. Da biste dohvatili ukupni zbroj, stvorite jednostavan upit za agregaciju pomoću sljedeće SQL naredbe:

    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
  4. Kad prijeđete na prikaz podatkovne tablice, trebali biste vidjeti jedan zapis:

    MaxOfDate Received

    SumOfQuantity

    5. 4. 2006.

    510

  5. Objedinite ta dva upita u upit s unijom da biste u zapise kupnje dodali zapis s ukupnom količinom:

    SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    UNION
    
    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    ORDER BY [Purchase Order Details].[Date Received];
  6. Kad prijeđete na prikaz podatkovne tablice, vidjet ćete četiri kupnje uz zbroj svake i zapis s ukupnim zbrojem količine:

    Datum primitka

    Količina

    22. 1. 2006.

    60

    22. 1. 2006.

    100

    4. 4. 2006.

    50

    5. 4. 2006.

    300

    5. 4. 2006.

    510

To obuhvaća osnove dodavanja ukupnih zbrojeva u upit s unijom. U oba upita možete dodati i fiksne vrijednosti, kao što su "Detalji" i "Ukupno" da biste vizualno razdvojili zapis ukupnog zbroja od ostalih zapisa. Upute za korištenje fiksnih vrijednosti pročitajte u odjeljku Kombiniranje triju ili više tablica ili upita u upitu s unijom.

Upiti s unijom u programu Access po zadanom obuhvaćaju samo zasebne zapise. No što ako želite uvrstiti sve zapise? Za to će vam biti koristan drugi primjer.

U prethodnom smo vam odjeljku pokazali kako stvoriti ukupni zbroj u upitu s unijom. Izmijenite SQL naredbu tog upita s unijom tako da obuhvaća ID proizvoda = 48:

SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

UNION

SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

ORDER BY [Purchase Order Details].[Date Received];

Kad prijeđete na prikaz podatkovne tablice, vidjet ćete pomalo zbunjujuć rezultat:

Datum primitka

Količina

22. 1. 2006.

100

22. 1. 2006.

200

Jedan zapis, dakako, neće u ukupnom zbroju vratiti dvostruku količinu.

Taj vam se rezultat pokazuje zato što je u jednom danu dvaput prodana ista količina čokolada, što je zabilježeno u tablici s pojedinostima narudžbenica. Ovo je rezultat jednostavnog upita odabiranja koji prikazuje oba zapisa u oglednoj bazi podataka Northwind:

ID narudžbenice

Proizvod

Količina

100

Northwind Traders – čokolada

100

92

Northwind Traders – čokolada

100

U prethodno navedenom upitu s unijom vidljivo je da polje ID narudžbenice nije njime obuhvaćeno i da ta dva polja ne čine dva različita zapisa.

Ako želite obuhvatiti sve zapise, u SQL naredbi koristite ključnu riječ UNION ALL umjesto UNION. To će najvjerojatnije utjecati na sortiranje rezultata, pa preporučujemo da dodate i uvjet ORDER BY da biste odredili redoslijed sortiranja. Evo izmijenjene SQL naredbe stvorene na temelju prethodnog primjera:

SELECT [Purchase Order Details].[Date Received], Null As [Total], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

UNION ALL

SELECT Max([Date Received]), "Total" As [Total], Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

ORDER BY [Total];

Kad prijeđete na prikaz podatkovne tablice, trebali biste vidjeti sve pojedinosti i ukupni zbroj kao posljednji zapis:

Datum primitka

Ukupno

Količina

22. 1. 2006.

 

100

22. 1. 2006.

 

100

22. 1. 2006.

Ukupno

200

Upit s unijom često se koristi kao izvor zapisa za kontrolu kombiniranog okvira na obrascu. Pomoću kombiniranog okvira možete odabrati vrijednost da biste filtrirali zapise na obrascu. Možete, primjerice, filtrirati zapise zaposlenika prema gradu.

Da biste vidjeli kako to funkcionira, evo još jednog primjera koji možete stvoriti u oglednoj bazi podataka Northwind koji objašnjava taj scenarij.

  1. Stvorite jednostavan upit odabiranja pomoću SQL sintakse:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
  2. Kad prijeđete na prikaz podatkovne tablice, trebali biste vidjeti sljedeće rezultate:

    Grad

    Filtar

    Osijek

    Osijek

    Split

    Split

    Zagreb

    Zagreb

    Pula

    Pula

    Osijek

    Osijek

    Zagreb

    Zagreb

    Osijek

    Osijek

    Zagreb

    Zagreb

    Osijek

    Osijek

  3. Kad pogledate te rezultate, možda ne uviđate njihovu vrijednost. No tada proširite upit te ga pretvorite u upit s unijom pomoću sljedeće SQL sintakse:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees
    
    UNION
    
    SELECT "<All>", "*" AS Filter
    FROM Employees
    
    ORDER BY City;
  4. Kad prijeđete na prikaz podatkovne tablice, trebali biste vidjeti sljedeće rezultate:

    Grad

    Filtar

    <sve>

    *

    Split

    Split

    Pula

    Pula

    Zagreb

    Zagreb

    Osijek

    Osijek

    Access objedinjuje devet prethodno prikazanih zapisa s fiksnim vrijednostima polja <sve> i "*".

    Budući da uvjet za stvaranje unije ne sadrži ključnu riječ UNION ALL, Access vraća samo različite zapise, što znači da se svaki grad u rezultatima pojavljuje samo jedanput uz identične fiksne vrijednosti.

  5. Sad kad imate gotov upit s unijom koji prikazuje naziv svakog grada samo jedanput te mogućnost kojom se zapravo odabiru svi gradovi, taj upit možete koristiti kao izvor zapisa za kombinirani okvir u obrascu. Iskoristite ovaj konkretni primjer kao model za stvaranje kontrole kombiniranog okvira na obrascu tako da upit postavite kao izvor zapisa, svojstvo Širina stupca za stupac Filtar postavite na 0 (nula) da biste ga sakrili, a potom svojstvo Povezani stupac postavite na 1 da bi služio kao indeks za drugi stupac. U svojstvo Filtar za sami obrazac potom možete dodati kod kao što je sljedeći da biste aktivirali filtar obrasca pomoću vrijednosti odabrane u kontroli kombiniranog okvira:

    Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'"
    Me.FilterOn = True

    Korisnik obrasca možete filtrirati zapise obrasca da bi odredio naziv grada ili pak odabrati <sve> da bi prikazao popis svih zapisa za sve gradove.

Vrh stranice

Proširite svoje vještine korištenja sustava Office
Istražite osposobljavanje

Jesu li vam ove informacije bile korisne?

Hvala vam na povratnim informacijama!

Hvala vam na povratnim informacijama! Čini se da bi vam pomoglo kad bismo vas povezali s nekim od naših agenata podrške za Office.

×