Včasih boste morda želeli združiti zapise iz ene tabele ali poizvedbe z zapisi iz ene ali več drugih tabel v en sam rezultat. To počne poizvedba za združevanje v Accessu.
Če se želite učinkovito seznaniti s poizvedbami za združevanje, se morate najprej seznaniti z načrtovanjem osnovnih poizvedb za izbiranje v Accessu. Več informacij o načrtovanju poizvedb za izbiranje najdete v članku Ustvarjanje preproste poizvedbe za izbiranje.
Ogled primera delujoče poizvedbe za združevanje
Če še nikoli niste ustvarili poizvedbe za združitev, vam bo morda pomagalo, če najprej preučite delujoč primer v predlogi Northwind Access. Vzorčno predlogo Northwind lahko poiščete na strani Uvod v Accessu, tako da izberete Datoteka>novo. Kopijo lahko prenesete tudi neposredno iz vzorčne predloge Northwind.
Ko Access odpre zbirko podatkov Northwind, zapustite pogovorno okno za prijavo, ki se najprej prikaže, in nato razširite podokno za krmarjenje. Izberite vrh podokna za krmarjenje in nato izberite Vrsta predmeta , da organizirate vse predmete zbirke podatkov po vrsti. Nato razširite skupino Poizvedbe in videli boste poizvedbo z imenom Transakcije izdelkov.
Poizvedbe za združevanje lahko preprosto ločite od drugih predmetov poizvedbe, saj imajo posebno ikono, podobno dvema prepletenima krogoma, ki predstavlja združen nabor dveh naborov:
Za razliko od običajnih poizvedb za izbiro in dejanje tabele niso povezane v poizvedbi za združevanje. To pomeni, da Accessovega oblikovalnika grafičnih poizvedb ne morete uporabiti za ustvarjanje ali urejanje poizvedb za združevanje. Če odprete poizvedbo za združevanje v podoknu za krmarjenje, jo Access odpre in prikaže rezultate v pogledu podatkovnega lista. V razdelku Pogledi na zavihku Osnovno upoštevajte, da pogled načrta ni na voljo, ko delate s poizvedbami za združevanje. Preklapljate lahko le med pogledom podatkovnega lista in pogledom SQL.
Če želite nadaljevati s preučevanjem tega primera poizvedbe za združevanje, kliknite Domov>Pogledi>SQL , da si ogledate SQL sintakso, ki ga določa. Na tej sliki smo dodali nekaj dodatnega razmika SQL , tako da si lahko preprosto ogledate različne dele, ki sestavljajo poizvedbo za združitev.
Oglejmo si podrobno SQL sintakso te poizvedbe za združevanje iz baze podatkov 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 in tretji del te izjave SQL sta pravzaprav dve poizvedbi za izbiranje. Ti poizvedbi pridobita različne nabore zapisov: enega iz tabele Naročila izdelkov in enega iz tabele Nakup izdelkov.
Drugi del te SQL izjave je ključna beseda UNION , ki Accessu pove, da združi ta dva niza zapisov.
Zadnji del te SQL izjave določa vrstni red združenih zapisov z izjavo.ORDER BY V tem primeru Access razvrsti vse zapise po polju »Datum naročila« v padajočem vrstnem redu.
Opomba
Poizvedbe za združevanje so vedno samo za branje v Accessu, zato ne morete spremeniti nobenih vrednosti v pogledu podatkovnega lista.
Ustvarjanje poizvedbe za združevanje z ustvarjanjem in združevanjem poizvedb za izbiranje
Čeprav lahko poizvedbo za združevanje ustvarite tako, da sintakso SQL napišete neposredno v pogledu SQL, jo boste morda lažje sestavili v dele z izbranimi poizvedbami. Nato lahko kopirate in prilepite dele SQL v združeno poizvedbo za združevanje.
Če želite preskočiti ta navodila in se namesto tega ogledati primer, si oglejte naslednji razdelek z naslovom Ogled primera ustvarjanja poizvedbe za združevanje.
- Na zavihku Ustvari v skupini Poizvedbe kliknite Načrt poizvedbe.
- Dvokliknite tabelo s polji, ki jih želite vključiti. Tabela se doda v okno z načrtom poizvedbe.
- V oknu z načrtom poizvedbe dvokliknite vsako polje, ki ga želite vključiti. Ko izbirate polja, preverite, ali ste dodali enako število polj in ali so v enakem vrstne redu kot ste jih dodali tudi v druge poizvedbe za izbiranje. Še posebej pa bodite pozorni na vrste podatkov v poljih in preverite, ali imajo v drugih poizvedbah, ki jih združujete, združljive vrste podatkov s polji na istem mestu. Če na primer najprej izberete poizvedbo s petimi polji in prvo polje vsebuje podatke o datumu/uri, se prepričajte, da imajo vse druge poizvedbe za izbiranje, ki jih združujete, pet polj in prvo polje vsebuje podatke o datumu/uri itd.
- Lahko pa poljem dodate pogoje tako, da vnesete ustrezne izraze v vrstico »Pogoji« mreže polja.
- Ko končate dodajanje polj in pogojev polj, zaženite poizvedbo za izbiranje in si oglejte njene rezultate. Na zavihku Načrt v skupini Rezultati kliknite Zaženi.
- Preklopite poizvedbo na pogled načrta.
- Shranite poizvedbo za izbiranje in jo pustite odprto.
- Ta postopek ponovite za vse poizvedbe za izbiranje, ki jih želite združiti.
Zdaj, ko ste ustvarili izbirne poizvedbe, je čas, da jih združite. V tem koraku ustvarite poizvedbo za združevanje tako, da kopirate in prilepite izjave SQL .
- Na zavihku Ustvari v skupini Poizvedbe kliknite Načrt poizvedbe.
- Na zavihku Načrt v skupini Poizvedba kliknite Združi. Access skrije okno načrta poizvedbe in prikaže zavihek » Pogled SQL «. Na tej točki je zavihek prazen.
- Kliknite zavihek prve poizvedbe za izbiranje, ki jo želite združiti v poizvedbo za združevanje.
- Na zavihku Osnovno kliknite Ogled>pogleda SQL.
- Kopirajte
SQLizjavo za poizvedbo za izbiro. Kliknite zavihek poizvedbe za združevanje, ki ste jo ustvarili v prejšnjem koraku. - Prilepite
SQLizjavo za poizvedbo za izbiranje na zavihek » Pogled SQL « v poizvedbi za združevanje. - Izbrišite podpičje (
;) na koncu izjave poizvedbeSQLselect. - Pritisnite tipko Enter, da premaknete kazalec za eno vrstico navzdol, nato pa vnesite
UNIONnovo vrstico. - Kliknite zavihek naslednje poizvedbe za izbiranje, ki jo želite združiti v poizvedbo za združevanje.
- Ponavljajte korake od 5 do 10, dokler ne kopirate in prilepite vseh
SQLizjav za izbirne poizvedbe v okno »Pogled SQL « poizvedbe za združevanje. Ne izbrišite podpičja in ne vnesite ničesar, kar slediSQLizjavi za zadnjo izbirno poizvedbo. - Na zavihku Načrt v skupini Rezultati kliknite Zaženi.
Rezultati poizvedbe za združevanje so prikazani v pogledu podatkovnega lista.
Ogled primera ustvarjanja poizvedbe za združevanje
Tukaj je primer, ki ga lahko znova ustvarite v zbirki vzorčnih zbirk podatkov Northwind. Ta poizvedba za združevanje zbere imena oseb iz tabele Stranke in jih združi z imeni oseb iz tabele Dobavitelji. Če želite uporabiti ta primer, upoštevajte ta navodila v svoji kopiji vzorčne zbirke podatkov Northwind.
Spodaj so navedena navodila, potrebna za ustvarjanje tega primera:
Ustvarite dve poizvedbe za izbiranje, imenovani »Poizveba1« in »Poizvedba2« s tabelama »Stranke« in »Dobavitelji« kot viroma podatkov. Uporabite polji »Ime« in »Priimek« kot prikazane vrednosti.
Ustvarite novo poizvedbo, imenovano »Poizvedba3«, ki sprva nima vira podatkov, in nato kliknite ukaz Unija na zavihku Načrt, da to poizvedbo nastavite kot poizvedbo za združevanje.
Kopirajte in prilepite izjave SQL iz poizvedbe1 in poizvedbe2 v poizvedbo3. Ne pozabite odstraniti dodatnega podpičja in dodati ključno besedo
UNION. Nato si lahko ogledate rezultate v pogledu podatkovnega lista.V eno od poizvedb dodajte klavzulo o razvrščanju in nato prilepite
ORDER BYizjavo v poizvedbo za združevanje v pogledu SQL. Opazili boste, da so v poizvedbi3 iz poizvedbe za združevanje, ko dodate stavek za razvrščanje, najprej odstranjena podpičja in nato še ime tabele iz imena polj.Končni primer
SQL, ki združuje in razvršča imena za ta primer poizvedbe za združevanje, je naslednji: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];
Če vam zelo ustreza pisanje SQL sintakse, lahko napišete svojo SQL izjavo za poizvedbo za združevanje neposredno v pogledu SQL. Vendar pa bo morda uporabno, če uporabite pristop kopiranja in lepljenja izjave SQL iz drugih predmetov poizvedbe. Vsaka poizvedba je lahko veliko bolj zapletena od tukaj uporabljenih primerov preproste poizvedbe za izbiranje. Morda bo uporabno, če ustvarite in natančno preskusite vsako poizvedbo, preden jih združite v poizvedbo za združevanje. Če poizvedbe za združevanje ne morete zagnati, lahko prilagodite vsako poizvedbo posebej tako, da jo boste lahko zagnali, in nato znova ustvarite poizvedbo za združevanje s popravljeno sintakso.
Več nasvetov in namigov o uporabi poizvedb za združevanje najdete v preostalih razdelkih v tem članku.
Združevanje treh ali več tabel ali poizvedb v poizvedbo za združevanje
V primeru iz prejšnjega razdelka, ki uporablja zbirko podatkov Northwind, so združeni podatki iz samo dveh tabel. Vendar pa lahko v poizvedbo za združevanje zelo preprosto združite tri ali več tabel. Če za izhodišče uporabite na primer prejšnji primer, lahko v rezultat poizvedbe vključite imena zaposlenih. To lahko naredite tako, da dodate tretjo poizvedbo in jo združite s prejšnjo izjavo SQL z dodatno ključno besedo UNION, in sicer tako:
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];
Ko si ogledate rezultat v pogledu podatkovnega lista, bodo vsi zaposleni navedeni z vzorčnim imenom podjetja, kar verjetno ni zelo uporabno. Če želite, da je v tem polju prikazano, ali je oseba interni zaposleni, dobavitelj ali stranka, lahko namesto imena podjetja vključite fiksno vrednost . Tukaj je videti SQL :
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];
Rezultati v pogledu podatkovnega lista pa so takšni. Access prikaže teh pet vzorčnih zapisov:
| Zaposlitev | Priimek | Ime |
|---|---|---|
| Interna | Novak | Tina |
| Interna | Cajhen | Barbara |
| Dobavitelj | Glažar | Stane |
| Stranka | Gobec | Janez |
| Stranka | Lubej Novak | Franc |
Poizvedbo lahko še bolj zmanjšate, ker Access prebere imena izhodnih polj le iz prve poizvedbe v poizvedbi za združevanje. Tukaj je odstranjen izhod iz drugega in tretjega odseka poizvedbe:
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];
Filtriranje v poizvedbah za združevanje
V Accessovi poizvedbi za združevanje je naročanje dovoljeno samo enkrat, vendar lahko vsako poizvedbo filtrirate posebej. Na podlagi poizvedbe za združevanje v prejšnjem razdelku je tukaj primer, ki filtrira vsako poizvedbo z dodajanjem stavka 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];
Preklopite na pogled podatkovnega lista, če želite prikazati rezultate, podobne tem:
| Zaposlitev | Priimek | Ime |
|---|---|---|
| Dobavitelj | Kovač | Katarina |
| Interna | Novak | Tina |
| Stranka | Žan | Gregor |
| Interna | Zupanc Makovec | Sonja |
| Dobavitelj | Lah Dežman | Amalija |
| Stranka | Miklič | Martin |
| Dobavitelj | Marolt | Miha |
| Dobavitelj | Zorko | Sonja |
| Interna | Kopač | Andrej |
| Dobavitelj | Kolar | Kornelija |
| Interna | Palčič | Robert |
Mešanje tipov podatkov
Če so poizvedbe, ki jih združite, zelo različne, lahko naletite na situacijo, v kateri mora izhodno polje združevati podatke različnih podatkovnih tipov. V takem primeru poizvedba za združevanje najpogosteje vrne rezultate kot podatkovni tip besedila, saj ta podatkovni tip podpira tako besedilo kot tudi številke.
Za prikaz delovanja tega primera bomo uporabili poizvedbo za združevanje Transakcije izdelka v vzorčni zbirki podatkov Northwind. Odprite to vzorčno zbirko podatkov in nato odprite poizvedbo »Transakcije izdelka« v pogledu podatkovnega lista. Zadnjih deset zapisov bi moralo biti podobnih temu rezultatu:
| ID izdelka | Datum naročila | Ime podjetja | Transakcija | Količina |
|---|---|---|---|---|
| 77 | 22. 1. 2006 | Dobavitelj B | Nakup | 60 |
| 80 | 22. 1. 2006 | ID dobavitelja | Nakup | 75 |
| 81 | 22. 1. 2006 | Dobavitelj A | Nakup | 125 |
| 81 | 22. 1. 2006 | Dobavitelj A | Nakup | 200 |
| 7 | 20. 1. 2006 | ID podjetja | Prodaja | 10 |
| 51 | 20. 1. 2006 | ID podjetja | Prodaja | 10 |
| 80 | 20. 1. 2006 | ID podjetja | Prodaja | 10 |
| 34 | 15. 1. 2006 | Podjetje AA | Prodaja | 100 |
| 80 | 15. 1. 2006 | Podjetje AA | Prodaja | 30 |
Predpostavimo, da želite polje »Količina« razdeliti na dve polji: »Nakup« in »Prodaj«. Predpostavimo tudi, da želite fiksno ničelno vrednost za polje brez vrednosti. Tukaj je videz SQL za to poizvedbo o združitvi:
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;
Če preklopite na pogled podatkovnega lista, bo zadnjih deset zapisov zdaj prikazanih tako:
| ID izdelka | Datum naročila | Ime podjetja | Transakcija | Nakup | Prodaja |
|---|---|---|---|---|---|
| 74 | 22. 1. 2006 | Dobavitelj B | Nakup | 20 | 0 |
| 77 | 22. 1. 2006 | Dobavitelj B | Nakup | 60 | 0 |
| 80 | 22. 1. 2006 | ID dobavitelja | Nakup | 75 | 0 |
| 81 | 22. 1. 2006 | Dobavitelj A | Nakup | 125 | 0 |
| 81 | 22. 1. 2006 | Dobavitelj A | Nakup | 200 | 0 |
| 7 | 20. 1. 2006 | ID podjetja | Prodaja | 0 | 10 |
| 51 | 20. 1. 2006 | ID podjetja | Prodaja | 0 | 10 |
| 80 | 20. 1. 2006 | ID podjetja | Prodaja | 0 | 10 |
| 34 | 15. 1. 2006 | Podjetje AA | Prodaja | 0 | 100 |
| 80 | 15. 1. 2006 | Podjetje AA | Prodaja | 0 | 30 |
Če nadaljujete s tem primerom, kaj če želite, da so polja z ničelnimi vrednostmi prazna? Če dodate ključno besedo, lahko spremenite tako SQL , da ne prikažete ničesar, tako da dodate ključno besedo Null , kot je prikazano tukaj:
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;
Vendar pa boste zdaj morda dobili nepričakovan rezultat, kot ste morda opazili pri preklopu na pogled podatkovnega lista. V stolpcu »Nakup« so vsa polja počiščena:
| ID izdelka | Datum naročila | Ime podjetja | Transakcija | Nakup | Prodaja |
|---|---|---|---|---|---|
| 74 | 22. 1. 2006 | Dobavitelj B | Nakup | ||
| 77 | 22. 1. 2006 | Dobavitelj B | Nakup | ||
| 80 | 22. 1. 2006 | ID dobavitelja | Nakup | ||
| 81 | 22. 1. 2006 | Dobavitelj A | Nakup | ||
| 81 | 22. 1. 2006 | Dobavitelj A | Nakup | ||
| 7 | 20. 1. 2006 | ID podjetja | Prodaja | 10 | |
| 51 | 20. 1. 2006 | ID podjetja | Prodaja | 10 | |
| 80 | 20. 1. 2006 | ID podjetja | Prodaja | 10 | |
| 34 | 15. 1. 2006 | Podjetje AA | Prodaja | 100 | |
| 80 | 15. 1. 2006 | Podjetje AA | Prodaja | 30 |
To se zgodi, ker Access določi podatkovne tipe polj iz prve poizvedbe. V tem primeru »Null« ni število.
Kaj se torej zgodi, če poskusite vstaviti prazen niz za prazne vrednosti polj? Postopek SQL za ta poskus je morda videti tako:
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;
Ko preklopite na pogled podatkovnega lista, boste opazili, da Access pridobi vrednosti iz stolpca »Nakupa«, vendar jih pretvori v besedilo. Te besedilne vrednosti prepoznate po poravnavi na levo v pogledu podatkovnega lista. Prazen niz v prvi poizvedbi ni število, zato vidite te rezultate. Opazili boste tudi, da so tudi vrednosti v polju »Prodaja« pretvorjene v besedilo, ker zapisi nakupa vsebujejo prazen niz.
| ID izdelka | Datum naročila | Ime podjetja | Transakcija | Nakup | Prodaja |
|---|---|---|---|---|---|
| 74 | 22. 1. 2006 | Dobavitelj B | Nakup | 20 | |
| 77 | 22. 1. 2006 | Dobavitelj B | Nakup | 60 | |
| 80 | 22. 1. 2006 | ID dobavitelja | Nakup | 75 | |
| 81 | 22. 1. 2006 | Dobavitelj A | Nakup | 125 | |
| 81 | 22. 1. 2006 | Dobavitelj A | Nakup | 200 | |
| 7 | 20. 1. 2006 | ID podjetja | Prodaja | 10 | |
| 51 | 20. 1. 2006 | ID podjetja | Prodaja | 10 | |
| 80 | 20. 1. 2006 | ID podjetja | Prodaja | 10 | |
| 34 | 15. 1. 2006 | Podjetje AA | Prodaja | 100 | |
| 80 | 15. 1. 2006 | Podjetje AA | Prodaja | 30 |
Kako torej rešite to uganko?
Ena od rešitev je, da poizvedbo prisilite, naj pričakuje, da je vrednost polja število. To lahko naredite s tem izrazom:
IIf(False, 0, Null)
Pogoj, ki ga je treba preveriti, False, ni nikoli True, zato izraz vedno vrne Null. Access pa še vedno ovrednoti obe možnosti izhoda in obravnava rezultat kot številski ali Null.
Ta izraz lahko v našem primeru uporabimo tako:
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;
Druge poizvedbe vam ni treba spreminjati.
Če preklopite na pogled podatkovnega lista, boste videli želeni rezultat:
| ID izdelka | Datum naročila | Ime podjetja | Transakcija | Nakup | Prodaja |
|---|---|---|---|---|---|
| 74 | 22. 1. 2006 | Dobavitelj B | Nakup | 20 | |
| 77 | 22. 1. 2006 | Dobavitelj B | Nakup | 60 | |
| 80 | 22. 1. 2006 | ID dobavitelja | Nakup | 75 | |
| 81 | 22. 1. 2006 | Dobavitelj A | Nakup | 125 | |
| 81 | 22. 1. 2006 | Dobavitelj A | Nakup | 200 | |
| 7 | 20. 1. 2006 | ID podjetja | Prodaja | 10 | |
| 51 | 20. 1. 2006 | ID podjetja | Prodaja | 10 | |
| 80 | 20. 1. 2006 | ID podjetja | Prodaja | 10 | |
| 34 | 15. 1. 2006 | Podjetje AA | Prodaja | 100 | |
| 80 | 15. 1. 2006 | Podjetje AA | Prodaja | 30 |
Drug način za pridobitev enakega rezultata, da poizvedbam v poizvedbi za združevanje vnaprej dodate še eno poizvedbo:
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 vsako polje vrne nespremenljive vrednosti za določen podatkovni tip. Seveda pa ne želite, da rezultat te poizvedbe vpliva na rezultate, zato morate v vrednost False vključiti stavek WHERE:
WHERE False
To je majhen trik. Ker je pogoj vedno »false«, poizvedba ne vrne ničesar. Če to izjavo združite z obstoječo izjavo SQL, je končna izjava podobna tej:
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;
Opomba
V tem primeru združena poizvedba v zbirki podatkov Northwind vrne 100 zapisov, medtem ko dve posamezni poizvedbi vrneta 58 in 43 zapisov za skupno 101 zapis. Do te razlike pride, ker dva zapisa nista enolična.
Če želite izvedeti, kako razrešiti ta primer z uporabo UNION ALLmožnosti .
Dodajanje skupnih vsot v poizvedbo za združevanje
Poizvedbo za združevanje lahko posebej uporabite združevanje nabora zapisov z enim zapisom, ki vsebuje vsoto vrednost enega ali več polj.
Tukaj je še en primer, ki ga lahko ustvarite v vzorčni zbirki podatkov Northwind, da prikažete, kako pridobite skupno vsoto v poizvedbi za združevanje.
Ustvarite novo preprosto poizvedbo za prikaz nakupa piva (ID izdelka v zbirki podatkov Northwind je 34 ) v tej sintaksi SQL:
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];Ko preklopite na pogled podatkovnega lista, bi morali biti prikazani štirje nakupi:
Datum prejema Količina 22. 1. 2006 100 22. 1. 2006 60 4. 4. 2006 50 5. 4. 2006 300 Če želite pridobiti skupno vsoto, ustvarite preprosto poizvedbo za zbiranje s to izjavo SQL:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))Ko preklopite na pogled podatkovnega lista, bi moral biti prikazan samo en zapis:
MaxOfDate Received SumOfQuantity 5. 4. 2006 510 Te dve poizvedbi združite v poizvedbo za združevanje, da v zapise nakupa dodate zapis s skupno količino:
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];Ko preklopite na pogled podatkovnega lista, bi morali biti prikazani štirje nakupi z vsoto posameznega nakupa, ki ji sledi zapis s skupno vsoto količine:
Datum prejema Količina 22. 1. 2006 60 22. 1. 2006 100 4. 4. 2006 50 5. 4. 2006 300 5. 4. 2006 510
To opisuje osnove dodajanja skupnih vsot v poizvedbo za združevanje. Morda boste želeli v obe poizvedbi vključiti tudi fiksne vrednosti, na primer »Podrobnosti« in »Skupaj«, da vizualno ločite zapis skupne vrednosti od drugih zapisov. Primer uporabe nespremenljivih vrednosti si lahko ogledate v razdelku Združevanje treh ali več tabel ali poizvedb v poizvedbo za združevanje.
Delo z razlikovalnimi zapisi v poizvedbah za združevanje z možnostjo UNION ALL
Poizvedbe za združevanje v Accessu privzeto vključujejo samo razlikovalne zapise. Kaj pa če želite vključiti vse zapise? Tukaj bo morda uporaben še en primer.
V prejšnjem razdelku smo vam pokazali, kako v poizvedbi za združevanje ustvarite skupno vsoto. Spremenite poizvedbo SQL za združevanje tako, da vključi Product ID = 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];
Ko preklopite na pogled podatkovnega lista, bi moral biti prikazan nekoliko zavajajoč rezultat:
| Datum prejema | Količina |
|---|---|
| 22. 1. 2006 | 100 |
| 22. 1. 2006 | 200 |
Seveda en zapis ne vrne dvakratne skupne količine.
Ta rezultat je prikazan, ker je bila v enem dnevu enaka količina čokolade prodana dvakrat, kot je prikazano v tabeli Podrobnosti naročila. Tukaj je prikazan rezultat preproste poizvedbe za izbiranje, ki prikazuje oba zapisa v vzorčni zbirki podatkov Northwind:
| ID naročilnice | Izdelek | Količina |
|---|---|---|
| 100 | Čokolada Northwind Traders | 100 |
| 92 | Čokolada Northwind Traders | 100 |
V prej omenjeni poizvedbi za združevanje lahko vidite, da polje ID naročilnice ni vključeno in da obe polji ne sestavljata dveh ločenih zapisov.
Če želite vključiti vse zapise, uporabite UNION ALL namesto v UNION .SQL To bo najverjetneje vplivalo na razvrščanje rezultatov, zato boste morda želeli vključiti tudi stavek ORDER BY za določitev vrstnega reda razvrščanja. Tukaj je spremenjeno na SQL podlagi prejšnjega 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];
Ko preklopite na pogled podatkovnega lista, bi se morale poleg skupne vsote prikazati vse podrobnosti kot zadnji zapis:
| Datum prejema | Skupna vsota | Količina |
|---|---|---|
| 22. 1. 2006 | 100 | |
| 22. 1. 2006 | 100 | |
| 22. 1. 2006 | Skupna vsota | 200 |
Uporaba poizvedbe za združevanje za filtriranje zapisov v obrazcu prek kontrolnika kombiniranega polja
Pogost način uporabe poizvedbe za združevanje je uporaba poizvedbe kot vira zapisov za kontrolnik kombiniranega polja v obrazcu. To kombinirano polje lahko uporabite za izbor vrednosti za filtriranje zapisov obrazca. Na primer za filtriranje zapisov zaposlenih glede na njihovo mesto.
Tukaj je še en primer, ki ga lahko ustvarite v vzorčni zbirki podatkov Northwind, da prikažete, kako bi ta primer lahko deloval.
Ustvarite preprosto poizvedbo za izbiro s to
SQLsintakso:SELECT Employees.City, Employees.City AS Filter FROM Employees;Ko preklopite na pogled podatkovnega lista, bi morali biti prikazani ti rezultati:
Mesto Filter Slovenj Gradec Slovenj Gradec Portorož Portorož Ljubljana Ljubljana Maribor Maribor Slovenj Gradec Slovenj Gradec Ljubljana Ljubljana Slovenj Gradec Slovenj Gradec Ljubljana Ljubljana Slovenj Gradec Slovenj Gradec Ti rezultati morda niso dokaj uporabni. Razširite poizvedbo in jo spremenite v poizvedbo za združevanje tako
SQL:SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;Ko preklopite na pogled podatkovnega lista, bi morali biti prikazani ti rezultati:
Mesto Filter <Vse> * Portorož Portorož Maribor Maribor Ljubljana Ljubljana Slovenj Gradec Slovenj Gradec Access izvede združitev devetih zapisov, ki so bili prej prikazani, s fiksnimi vrednostmi polj <All> in »*«. Ker ta spojni klavzul ne vsebuje
UNION ALL, Access vrne le ločene zapise. To pomeni, da se vsako mesto vrne samo enkrat s fiksnimi enakimi vrednostmi.Ko ustvarite poizvedbo za združevanje, ki vsako ime mesta prikaže le enkrat, poleg tega pa še možnost, ki učinkovito izbere vsa mesta, pa lahko to poizvedbo uporabite kot vir zapisa za kombinirano polje v obrazcu. Če ta določen primer uporabite kot model, lahko v obrazcu ustvarite kontrolnik kombiniranega polja, nastavite to poizvedbo kot vir zapisa, lastnost »Širina stolpca« za stolpec »Filter« nastavite na 0 (nič), da ga skrijete, in nato lastnost »Vezan stolpec« nastavite na 1, da označite kazalo drugega stolpca. V
Filterlastnosti samega obrazca lahko nato dodate kodo, kot je ta, da aktivirate filter obrazca z vrednostjo, izbrano v kontrolniku kombiniranega polja:Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = TrueUporabnik obrazca lahko nato filtrira zapise obrazca na določeno ime mesta ali pa izbere <Vse,> da navede vse zapise za vsa mesta.