Ponekad ćete možda želeti da navedete zapise iz jedne tabele ili upita sa onima iz jedne ili više drugih tabela da biste napravili jedan skup zapisa – listu sa svim zapisima iz dve ili više tabela. To je svrha upita za združivanje u programu Access.
Da biste dobro razumeli upite za združivanje, prvo treba da se upoznate sa dizajniranjem osnovnih upita u programu Access. Da biste saznali više o dizajniranju upita za izbor, pogledajte članak Pravljenje jednostavnog upita za izdvajanje.
Proučite radni primer upita za združivanje
Ako nikada ranije niste napravili upit za združivanje, bilo bi korisno da prvo proučite radni primer u Northwind Access predlošku. Možete da pronađete predložak Northwind uzorka na stranici „Prvi koraci“ programa Access tako što ćete kliknuti na stavke Datoteka > Novo ili možete direktno da preuzmete kopiju sa ove lokacije: Predložak Northwind uzorka.
Kada Access otvori Northwind bazu podataka, odbacite dijalog za prijavu koji se prvi pojavi, a zatim razvijte okno za navigaciju. Kliknite u vrhu okna za navigaciju, a zatim izaberite stavku Tip objekta da biste organizovali sve objekte baze podataka po tipu. Zatim razvijte grupu Upiti i videćete upit Transakcije proizvoda.
Upiti za združivanje se lako razlikuju od drugih objekata upita jer imaju posebnu ikonu koja liči na dva isprepletena kruga koji predstavljaju skup nastao sjedinjavanjem dva skupa:
Za razliku od normalnih upita za izdvajanje i radnje, tabele nisu povezane u upit za združivanje, što znači da Access grafički dizajner upita nije moguće koristiti za pravljenje ili uređivanje upita za združivanje. Na to ćete naići ako otvorite upit za združivanje u oknu za navigaciju; Access ga otvara i prikazuje rezultate u prikazu lista sa podacima. U komandi Prikazi na kartici Početak primetićete da stavka Prikaz dizajna nije dostupna kada radite sa upitima za združivanje. Možete samo da se prebacujete između stavki Prikaz lista sa podacima i SQL prikaz pri radu sa upitima za združivanje.
Da biste nastavili proučavanje ovog primera upita za združivanje, kliknite na stavke Početak > Prikazi > SQL prikaz da biste videli SQL sintaksu koja ga definiše. U ovoj ilustraciji smo uneli dodatni razmak u SQL da biste lako mogli da uočite različite delove koji ulaze u sastav upita za združivanje.
Hajde da detaljno proučimo SQL sintaksu ovog upita za združivanje iz Northwind baze podataka:
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 deo ove SQL izjave u suštini predstavljaju dva upita za izbor. Ovi upiti preuzimaju dva različita skupa zapisa; jedan iz tabele Porudžbine proizvoda, a drugi iz tabele Kupovine proizvoda.
Drugi deo ovog SQL izraza je ključna reč UNION, koja govori programu Access da ovaj upit kombinuje ova dva skupa zapisa.
Poslednji deo ovog SQL izraza određuje raspored kombinovanih zapisa pomoću izjave ORDER BY. U ovom primeru, Access će poručiti sve zapise prema polju „Datum porudžbine“ u opadajućem redosledu.
Napomena: Upiti za združivanje su uvek samo za čitanje u programu Access; ne možete da promenite vrednosti u prikazu lista sa podacima.
Napravite upit za združivanje pravljenjem i kombinovanjem upita za izdvajanje
Iako možete da napravite upit za združivanje tako što ćete direktno napisati SQL sintaksu u SQL prikazu, možda će vam biti lakše da ga napravite iz delova pomoću upita za izdvajanje. Zatim možete da kopirate i nalepite SQL delove u kombinovani upit za združivanje.
Ako želite da preskočite čitanje koraka i da umesto toga pogledate primer, pređite na sledeći odeljak, Pogledajte primer pravljenja upita za združivanje.
-
Na kartici Kreiranje, u grupi Upiti kliknite na dugme Dizajn upita.
-
Kliknite dvaput na tabelu koja sadrži polja koja želite da uključite. Tabela će biti dodata u prozor za dizajn upita.
-
U prozoru za dizajn upita kliknite dvaput na svako polje koje hoćete da uključite. Dok birate polja, uverite se da ste dodali isti broj polja, istim redosledom kao i u druge upite za izdvajanje. Obratite pažnju na tipove podataka polja i proverite da li imaju kompatibilne tipove podataka sa poljima na istoj poziciji u drugim upitima koje kombinujete. Na primer, ako prvi upit za izdvajanje ima pet polja od kojih prvo sadrži podatke o datumu/vremenu, proverite da li svaki od drugih upita za izdvajanje koje kombinujete takođe ima pet polja od kojih prvo sadrži podatke o datumu/vremenu i tako dalje.
-
Opcionalno, dodajte kriterijume u polja tako što ćete otkucati odgovarajuće izraze u redu „Kriterijumi“ u koordinatnoj mreži polja.
-
Kada dodate polja i kriterijume polja, trebalo bi da pokrenete upit za izdvajanje i pregledate njegov rezultat. Na kartici Dizajn, u grupi Rezultati kliknite na dugme Pokreni.
-
Prebacite upit na prikaz dizajna.
-
Sačuvajte upit za izdvajanje i ostavite ga otvorenog.
-
Ponovite ovu proceduru za svaki od upita za izdvajanje koje želite da kombinujete.
Pošto ste sada napravili upite za izdvajanje, vreme je da ih kombinujete. U ovom koraku ćete napraviti upit za združivanje tako što ćete kopirati i nalepiti SQL izraze.
-
Na kartici Kreiranje, u grupi Upiti kliknite na dugme Dizajn upita.
-
Na kartici Dizajn, u grupi Upit kliknite na stavku Združivanje. Access skriva prozor dizajna upita, a prikazuje karticu objekta SQL prikaza. U ovom trenutku kartica objekta SQL prikaza je prazna.
-
Izaberite karticu za prvi upit za izdvajanje koji želite da kombinujete u upitu za združivanje.
-
Na kartici Početak kliknite na Prikaz > SQL prikaz.
-
Kopirajte SQL izraz za upit za izdvajanje. Izaberite karticu za upit za združivanje koji ste počeli da pravite ranije.
-
Nalepite SQL instrukciju za upit za izdvajanje u karticu objekta u SQL prikazu upita za združivanje.
-
Izbrišite znak tačka i zarez (;) na kraju SQL instrukcije upita za izdvajanje.
-
Pritisnite taster Enter da biste premestili kursor za jedan red nadole, a zatim u novom redu otkucajte reč UNION.
-
Izaberite karticu za sledeći upit za izdvajanje koji želite da kombinujete u upitu za združivanje.
-
Ponavljajte korake od 5. do 10. dok ne kopirate i nalepite sve SQL izraze za upite za izdvajanje u prozor SQL prikaza upita za združivanje. Nemojte da brišete tačku i zarez niti kucate ništa posle SQL izraza za poslednji upit za izdvajanje.
-
Na kartici Dizajn, u grupi Rezultati kliknite na dugme Pokreni.
Rezultati upita za združivanje pojavljuju se u prikazu lista sa podacima.
Pogledajte primer pravljenja upita za združivanje
Evo primera koji možete ponovo da napravite u probnoj Northwind bazi podataka. Ovaj upit za združivanje prikuplja imena osoba iz tabele Klijenti i kombinuje ih sa imenima osoba iz tabele Dobavljači. Ako želite da ispratite ovaj primer, ponavljajte ove korake u svojoj kopiji probne Northwind baze.
Evo koraka potrebnih za pravljenje ovog primera:
-
Napravite dva upita za izdvajanje koji se zovu Upit1 i Upit2 tako da izvor podataka za prvi bude tabela „Klijenti“, a za drugi tabela „Dobavljači“. Koristite polja „Ime“ i „Prezime“ kao vrednosti za prikaz.
-
Napravite novi upit koji se zove Upit3 i koji je u početku bez izvora podataka, a zatim kliknite na komandu Sjedinjavanje na kartici Dizajn da biste ovaj upit pretvorili u upit za združivanje.
-
Kopirajte i nalepite SQL izjave iz Upita1 i Upita2 u Upit3. Uverite se da ste uklonili nepotrebne tačke i zareze i dodali ključnu reč UNION. Zatim možete da proverite rezultate u prikazu lista sa podacima.
-
Dodajte odredbu poručivanja u jedan od upita, a zatim nalepite izraz ORDER BY u SQL prikaz upita za združivanje. Imajte na umu da se u Upitu3, upitu za združivanje, neposredno pre dodavanja poručivanja, prvo uklanjaju tačke i zarezi, a zatim ime tabele iz imena polja.
-
Konačni SQL koji kombinuje i sortira imena za ovaj probni upit za združivanje glasi 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 imate iskustva u pisanju SQL sintakse, svakako možete da napišete sopstvenu SQL izjavu za upit za združivanje direktno u SQL prikazu. Međutim, možda će vam biti korisno da pratite pristup kopiranja i lepljenja SQL-a iz drugih objekata upita. Svaki upit može da bude mnogo složeniji od jednostavnih upita za izdvajanje koji su ovde korišćeni kao primeri. Može biti korisno da pažljivo napravite i testirate svaki upit pre nego što ih iskombinujete u upit za združivanje. Ako se upit za združivanje ne pokrene, možete da prilagodite svaki upit pojedinačno dok ne uspe i da zatim ponovo napravite upit za združivanje sa ispravljenom sintaksom.
Pregledajte preostale odeljke u ovom članku da biste saznali više saveta i trikova o korišćenju upita za združivanje.
U primeru iz prethodnog odeljka u kojem se koristi Northwind baza podataka kombinuju se samo podaci iz dve tabele. Međutim, veoma lako možete da iskombinujete tri ili više tabela u upit za združivanje. Na primer, na osnovu prethodnog primera, u rezultat upita možete da uključite i imena zaposlenih. Možete da postignete taj zadatak dodavanjem trećeg upita i kombinovanjem sa prethodnim SQL izrazom uz dodatnu ključnu reč UNION, na sledeći način:
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 rezultate u prikazu lista sa podacima, svi zaposleni će biti navedeno ime preduzeća uzorak, koji verovatno nije korisno. Ako želite da to polje pokazuje da li je osoba interni zaposleni, zaposleni dobavljača ili zaposleni klijenta, možete da navedete fiksnu vrednost umesto imena preduzeća. Evo kako bi SQL izgledao:
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 izgleda rezultat u prikazu lista sa podacima. Access prikazuje ovih pet probnih zapisa:
Zapošljavanje |
Prezime |
Ime |
Interno |
Jović |
Nada |
Interno |
Mlađenović |
Sara |
Dobavljač |
Jevtić |
Sava |
Klijent |
Rašković |
Slobodan |
Klijent |
Pavle Đorović |
Srećko |
Upit iznad može se još više smanjiti jer Access čita samo imena izlaznih polja iz prvog upita u upitu za združivanje. Ovde vidite da smo uklonili izlaz iz odeljaka drugog i trećeg 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 Access upitu za združivanje naručivanje je dozvoljeno samo jednom, ali svaki upit može da se filtrira pojedinačno. Na osnovu upita za združivanje u prethodnom odeljku, evo primera toga gde smo filtrirali svaki upit dodavanjem odredbe 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];
Prebacite se na prikaz lista sa podacima i videćete rezultate slične ovima:
Zapošljavanje |
Prezime |
Ime |
Dobavljač |
Daničić |
Jovana K. |
Interno |
Jović |
Nada |
Klijent |
Kojić |
Predrag |
Interno |
Simović |
Dragoslava |
Dobavljač |
Vuković |
Dunja |
Klijent |
Jokanović |
Đorđe |
Dobavljač |
Jovović |
Nenad |
Dobavljač |
Sovrlić |
Luka |
Interno |
Stanković |
Nebojša |
Dobavljač |
Todorović |
Snežana |
Interno |
Macura |
Obrad |
Ako su upiti za združivanje veoma različiti, možete naići na situaciju u kojoj se u izlaznom polju moraju kombinovati podaci različitih tipova. U tom slučaju, upit za združivanje će najčešće davati rezultate kao podatke tekstualnog tipa jer taj tip podataka može da sadrži i tekst i brojeve.
Da biste saznali kako ovo funkcioniše, koristićemo upit za združivanje Transakcije proizvoda u Northwind bazi podataka. Otvorite tu probnu bazu podataka, a zatim otvorite upit Transakcije proizvoda u prikazu lista sa podacima. Poslednjih deset zapisa trebalo bi da budu slični ovom izlazu:
ID proizvoda |
Datum porudžbine |
Ime preduzeća |
Transakcija |
Količina |
77 |
22.1.2006. |
Dobavljač B |
Kupovina |
60 |
80 |
22.1.2006. |
Dobavljač D |
Kupovina |
75 |
81 |
22.1.2006. |
Dobavljač A |
Kupovina |
125 |
81 |
22.1.2006. |
Dobavljač A |
Kupovina |
200 |
7 |
20.1.2006. |
Preduzeće D |
Prodaja |
10 |
51 |
20.1.2006. |
Preduzeće D |
Prodaja |
10 |
80 |
20.1.2006. |
Preduzeće D |
Prodaja |
10 |
34 |
15.1.2006. |
Preduzeće AA |
Prodaja |
100 |
80 |
15.1.2006. |
Preduzeće AA |
Prodaja |
30 |
Recimo da želite da polje „Količina“ podelite na dva – „Kupovina“ i „Prodaja“. Recimo da želite da imate na fiksnu vrednost nula za polje bez vrednosti. Evo kako izgleda SQL za ovaj upit za združivanje:
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 se prebacite na prikaz lista sa podacima, videćete poslednjih deset zapisa koji su sada prikazani ovako:
ID proizvoda |
Datum porudžbine |
Ime preduzeća |
Transakcija |
Kupovina |
Prodaja |
74 |
22.1.2006. |
Dobavljač B |
Kupovina |
20 |
0 |
77 |
22.1.2006. |
Dobavljač B |
Kupovina |
60 |
0 |
80 |
22.1.2006. |
Dobavljač D |
Kupovina |
75 |
0 |
81 |
22.1.2006. |
Dobavljač A |
Kupovina |
125 |
0 |
81 |
22.1.2006. |
Dobavljač A |
Kupovina |
200 |
0 |
7 |
20.1.2006. |
Preduzeće D |
Prodaja |
0 |
10 |
51 |
20.1.2006. |
Preduzeće D |
Prodaja |
0 |
10 |
80 |
20.1.2006. |
Preduzeće D |
Prodaja |
0 |
10 |
34 |
15.1.2006. |
Preduzeće AA |
Prodaja |
0 |
100 |
80 |
15.1.2006. |
Preduzeće AA |
Prodaja |
0 |
30 |
Nastavljajući sa ovim primerom, šta ako želite da polja sa nulom budu prazna? Možete da izmenite SQL tako da ne prikazuje ništa umesto nule ako dodate ključnu reč „Null“ na sledeći način:
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;
Međutim, kao što ste možda primetili prilikom prebacivanja na prikaz lista sa podacima, sada imate neočekivani rezultat. U koloni „Kupovina“ je opozvan izbor u svakom polju:
ID proizvoda |
Datum porudžbine |
Ime preduzeća |
Transakcija |
Kupovina |
Prodaja |
74 |
22.1.2006. |
Dobavljač B |
Kupovina |
||
77 |
22.1.2006. |
Dobavljač B |
Kupovina |
||
80 |
22.1.2006. |
Dobavljač D |
Kupovina |
||
81 |
22.1.2006. |
Dobavljač A |
Kupovina |
||
81 |
22.1.2006. |
Dobavljač A |
Kupovina |
||
7 |
20.1.2006. |
Preduzeće D |
Prodaja |
10 |
|
51 |
20.1.2006. |
Preduzeće D |
Prodaja |
10 |
|
80 |
20.1.2006. |
Preduzeće D |
Prodaja |
10 |
|
34 |
15.1.2006. |
Preduzeće AA |
Prodaja |
100 |
|
80 |
15.1.2006. |
Preduzeće AA |
Prodaja |
30 |
To se događa zato Access određuje tipove podataka polja iz prvog upita. U ovom primeru „Null“ nije broj.
Šta se dešava ako pokušate da umetnete praznu nisku umesto prazne vrednosti polja? SQL u ovom pokušaju može da izgleda 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 se prebacite na prikaz lista sa podacima, videćete da Access preuzima vrednosti stavke „Kupovina“, ali ih je konvertovao u tekst. Znate da su ovo tekstualne vrednosti po tome što su poravnate ulevo u prikazu lista sa podacima. Prazna niska u prvom upitu nije broj, zbog čega i vidite ove rezultate. Primetićete da su i vrednosti stavke „Prodaja“ konvertovane u tekst jer zapisi o kupovini sadrže praznu nisku.
ID proizvoda |
Datum porudžbine |
Ime preduzeća |
Transakcija |
Kupovina |
Prodaja |
74 |
22.1.2006. |
Dobavljač B |
Kupovina |
20 |
|
77 |
22.1.2006. |
Dobavljač B |
Kupovina |
60 |
|
80 |
22.1.2006. |
Dobavljač D |
Kupovina |
75 |
|
81 |
22.1.2006. |
Dobavljač A |
Kupovina |
125 |
|
81 |
22.1.2006. |
Dobavljač A |
Kupovina |
200 |
|
7 |
20.1.2006. |
Preduzeće D |
Prodaja |
10 |
|
51 |
20.1.2006. |
Preduzeće D |
Prodaja |
10 |
|
80 |
20.1.2006. |
Preduzeće D |
Prodaja |
10 |
|
34 |
15.1.2006. |
Preduzeće AA |
Prodaja |
100 |
|
80 |
15.1.2006. |
Preduzeće AA |
Prodaja |
30 |
Kako da rešite ovu zagonetku?
Rešenje je da nametnete da upit očekuje da vrednost polja bude broj. To se može postići pomoću izraza:
IIf(False, 0, Null)
Uslov koji treba proveriti, False, nikada neće biti True, tako da će, samim tim, izraz uvek vraćati Null, ali Access i dalje procenjuje obe opcije izlaza i odlučuje da izlaz bude numerički ili „Null“.
Evo kako možemo da koristimo ovaj izraz u ovom radnom primeru:
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 nije potrebno menjati drugi upit.
Ako se prebacite na prikaz lista sa podacima, videćete rezultat koji želimo:
ID proizvoda |
Datum porudžbine |
Ime preduzeća |
Transakcija |
Kupovina |
Prodaja |
74 |
22.1.2006. |
Dobavljač B |
Kupovina |
20 |
|
77 |
22.1.2006. |
Dobavljač B |
Kupovina |
60 |
|
80 |
22.1.2006. |
Dobavljač D |
Kupovina |
75 |
|
81 |
22.1.2006. |
Dobavljač A |
Kupovina |
125 |
|
81 |
22.1.2006. |
Dobavljač A |
Kupovina |
200 |
|
7 |
20.1.2006. |
Preduzeće D |
Prodaja |
10 |
|
51 |
20.1.2006. |
Preduzeće D |
Prodaja |
10 |
|
80 |
20.1.2006. |
Preduzeće D |
Prodaja |
10 |
|
34 |
15.1.2006. |
Preduzeće AA |
Prodaja |
100 |
|
80 |
15.1.2006. |
Preduzeće AA |
Prodaja |
30 |
Drugi način da postignete isti rezultat jeste da dodate upite ispred upita za združivanje sa nekim drugim upitom:
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
Za svako polje Access vraća fiksne vrednosti tipa podataka koji definišete. Naravno, ne želite da se izlaz ovog upita meša sa rezultatima, a da biste to izbegli, treba da dodate odredbu WHERE vrednosti False:
WHERE False
To je mali trik jer ovo uvek ima vrednost „false“, pa upit ne vraća ništa. Kada iskombinujemo ovu izjavu sa postojećim SQL-om, dobijamo dovršenu izjavu koja glasi ovako:
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: Kombinovani upit u ovom primeru koji koristi Northwind bazu podataka vraća 100 zapisa, dok dva pojedinačnih upita vraćaju 58 i 43 zapisa, što je ukupno 101 zapis. Razlog za to neslaganje je to što dva zapisa nisu jedinstvena. Pogledajte odeljak Rad sa jedinstvenim zapisima u upitima za združivanje koristeći UNION ALL da biste saznali kako da rešite ovaj scenario koristeći UNION ALL.
Poseban slučaj upita za združivanje jeste kombinovanje skupa zapisa sa jednim zapisom koji sadrži zbir jednog ili više polja.
Evo još jednog primera koji možete da napravite u probnoj Northwind bazi podataka da bismo ilustrovali kako da dobijete ukupnu vrednost u upitu za združivanje.
-
Napravite novi jednostavan upit da biste prikazali kupovinu piva (ID proizvoda = 34 u Northwind bazi podataka) koristeći sledeću SQL sintaksu:
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];
-
Pređite na prikaz lista sa podacima i trebalo bi da vidite četiri kupovine:
Datum prijema
Količina
22.1.2006.
100
22.1.2006.
60
4.4.2006.
50
5.4.2006.
300
-
Da biste dobili ukupnu vrednost, napravite jednostavan agregatni upit pomoću sledećeg SQL-a:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))
-
Pređite na prikaz lista sa podacima i trebalo bi da vidite samo jedan zapis:
Maksimalan datum prijema
Zbir količine
5.4.2006.
510
-
Iskombinujte ova dva upita u upit za združivanje da biste na početak zapisa o kupovini dodali zapis sa 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];
-
Prebacite se na prikaz lista sa podacima i trebalo bi da vidite četiri kupovine sa zbirom za svaku od njih, nakon čega dolazi zapis sa ukupnom količinom:
Datum prijema
Količina
22.1.2006.
60
22.1.2006.
100
4.4.2006.
50
5.4.2006.
300
5.4.2006.
510
To bi bilo sve o osnovama dodavanja ukupnih vrednosti u upit za združivanje. Ne bi bilo loše ni da dodate fiksne vrednosti u oba upita, kao što su „Detalj“ i „Ukupna vrednost“ da biste vizuelno razdvojili zapis sa ukupnom vrednošću od ostalih zapisa. Možete da pregledate pomoću fiksnih vrednosti u odeljku Kombinujte tri ili više tabela ili upita u upit za združivanje.
Upiti za združivanje u programu Access podrazumevano obuhvataju samo jedinstvene zapise. Ali, šta ako želite da uključite sve zapise? Drugi primer bi ovde bio koristan.
U prethodnom odeljku, pokazali smo vam kako da napravite ukupnu vrednost u upitu za združivanje. Izmenite SQL tog upita za združivanje da biste obuhvatili 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];
Pređite na prikaz lista sa podacima i trebalo bi da vidite prilično nepouzdan rezultat:
Datum prijema |
Količina |
22.1.2006. |
100 |
22.1.2006. |
200 |
Jedan zapis, naravno, ne vraća dvaput veću ukupnu količinu.
Ovaj rezultat vidite zato što je jednog dana ista količina čokolade prodata dva puta – kao što je evidentirano u tabeli „Detalji o porudžbenici“. Evo jednostavnog upita za izdvajanje koji prikazuje oba zapisa u Northwind bazi podataka:
ID porudžbenice |
Proizvod |
Količina |
100 |
Northwind Traders čokolada |
100 |
92 |
Northwind Traders čokolada |
100 |
U pomenutom upitu za združivanje možete da vidite da polje „ID porudžbenice“ nije obuhvaćeno i da dva polja ne čine dva jedinstvena zapisa.
Ako želite da obuhvatite sve zapise, koristite UNION ALL umesto UNION u SQL-u. To će verovatno uticati na sortiranje rezultata, tako da ne bi bilo loše da dodate odredbu ORDER BY da biste odredili redosled sortiranja. Evo izmenjenog SQL-a na osnovu prethodnog primera:
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];
Prebacite se na prikaz lista sa podacima i trebalo bi da kao poslednji zapis vidite sve detalje pored ukupne vrednosti:
Datum prijema |
Ukupno |
Količina |
22.1.2006. |
100 |
|
22.1.2006. |
100 |
|
22.1.2006. |
Ukupno |
200 |
Uobičajena upotreba upita za združivanje jeste da se on koristi kao izvor zapisa za kontrolu kombinovanog okvira u obrascu. Možete da koristite taj kombinovani okvir da biste izabrali vrednost za filtriranje zapisa u obrascu. Na primer, za filtriranje podataka o zaposlenima prema gradu.
Da biste videli kako ovo funkcioniše, evo još jednog primera koji možete da napravite u probnoj Northwind bazi podataka radi ilustracije ovog scenarija.
-
Napravite jednostavan upit za izdvajanje pomoću sledeće SQL sintakse:
SELECT Employees.City, Employees.City AS Filter FROM Employees;
-
Pređite na prikaz lista sa podacima i trebalo bi da vidite sledeće rezultate:
Grad
Filter
Subotica
Subotica
Novi Sad
Novi Sad
Kragujevac
Kragujevac
Sombor
Sombor
Subotica
Subotica
Kragujevac
Kragujevac
Subotica
Subotica
Kragujevac
Kragujevac
Subotica
Subotica
-
Gledajući te rezultate, možda nećete uspeti da vidite u čemu je njihova vrednost. Međutim, razvijte upit i transformišite ga u upit za združivanje koristeći sledeći SQL:
SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;
-
Pređite na prikaz lista sa podacima i trebalo bi da vidite sledeće rezultate:
Grad
Filter
<Sve>
*
Novi Sad
Novi Sad
Sombor
Sombor
Kragujevac
Kragujevac
Subotica
Subotica
Access objedinjuje devet prethodno prikazanih zapisa sa fiksnim vrednostima polja <Sve> i „*“.
Pošto ova odredba za združivanje ne sadrži UNION ALL, Access vraća samo jedinstvene zapise, što znači da se svaki grad vraća samo jednom sa fiksnim identičnim vrednostima.
-
Pošto sada imate dovršeni upit za združivanje koji prikazuje ime svakog grada samo jednom, kao i opciju koja efikasno bira sve gradove, možete da koristite ovaj upit kao izvor zapisa za kombinovani okvir u obrascu. Koristeći ovaj konkretni primer kao model, možete da napravite kontrolu kombinovanog okvira u obrascu, postavite ovaj upit kao izvor zapisa, postavite svojstvo „Širina kolone“ za kolonu „Filter“ na 0 (nula) da biste ga vizuelno sakrili i da zatim postavite svojstvo „Povezana kolona“ na vrednost 1 da biste označili indeks druge kolone. U svojstvu „Filter“ u samom obrascu zatim možete da dodate kôd sličan dolenavedenom da biste aktivirali filter obrasca pomoću vrednosti stavke koja je izabrana u kontroli kombinovanog okvira:
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
Korisnik obrasca može zatim da filtrira zapise obrasca po imenu određenog grada ili da izabere <Sve> da bi prikazao listu svih zapisa za sve gradove.