Joskus haluat ehkä luetteloida yhden taulukon tai kyselyn tietueet yhdessä yhden tai useamman muun taulukon kanssa niin että saat yhden tietuejoukon, joka sisältää kaikki yhden tai useamman taulukon sisältämät tietueet. Tämä on Accessin yhdistämiskyselyn tarkoitus.
Jotta ymmärrät kunnolla, mistä yhdistämiskyselyssä on kyse, sinun on hyvä ensin perehtyä siihen, miten Accessissa luodaan yksinkertaisia valintakyselyitä. Lisätietoja valintakyselyjen suunnittelemisesta saat artikkelista Yksinkertaisen valintakyselyn luominen.
Perehtyminen toimivaan esimerkkiin yhdistämiskyselystä
Jos et ole koskaan ennen luonut yhdistämiskyselyä, kannattaa ehkä tarkastella toimivaa esimerkkiä sellaisesta Northwind Access -mallissa. Voit hakea Northwind-esimerkkimallia Accessin aloitussivulta napsauttamalla Tiedosto > Uusi tai voit suoraan ladata kopion tästä sijainnista: Northwind-esimerkkimalli.
Kun Access avaa Northwind-tietokannan, sulje ensiksi aukeava kirjautumislomake ja laajenna sitten siirtymisruutua. Napsauta siirtymisruudun yläreunaa ja valitse sitten Objektityyppi kaikkien tietokantaobjektien järjestämiseksi niiden tyypin mukaan. Laajenna seuraavaksi Kyselyt-ryhmä, niin näet kyselyn nimeltä Tuotetapahtumat.
Yhdistämiskyselyt on helppo erottaa muista kyselyobjekteista, koska niillä on erityinen kuvake, joka muistuttaa kahta yhteen kietoutunutta ympyrää ja edustaa kahdesta joukosta yhdistettyä joukkoa:
Toisin kuin normaaleissa valinta- ja muutoskyselyissä, taulukot eivät ole yhteydessä toisiinsa yhdistämiskyselyssä, mikä tarkoittaa, että Accessin graafista kyselyjen suunnittelutyökalua ei voi käyttää yhdistämiskyselyjen luomiseen eikä muokkaamiseen. Huomaat tämän, jos avaat yhdistämiskyselyn siirtymisruudusta: Access avaa sen ja näyttää tulokset taulukkonäkymässä. Näkymät- komennon kohdalla Aloitus-välilehdessä huomaat, että Rakennenäkymä ei ole käytettävissä yhdistämiskyselyjä käsiteltäessä. Yhdistämiskyselyillä työskennellessä voit siirtyä vain Taulukkonäkymän ja SQL-näkymän välillä.
Jatka tämän yhdistämiskyselyesimerkin tarkastelua napsauttamalla Aloitus > Näkymät > SQL-näkymä, jolloin pääset tarkastelemaan sen määrittävää SQL-syntaksia. Oheisessa kuvassa SQL:ään on lisätty joitakin ylimääräisiä välilyöntejä, joten näet helposti yhdistämiskyselyn muodostavat osat.
Tarkastellaanpa yksityiskohtaisesti tämän Northwind-tietokannan yhdistämiskyselyn SQL-syntaksia:
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;
Tämän SQL-lausekkeen ensimmäinen ja kolmas osa ovat käytännössä kaksi valintakyselyä. Nämä kyselyt noutavat kaksi erilaista tietuejoukkoa; yhden taulukosta Tuotantotilaukset ja yhden taulukosta Tuoteostot.
Tämän SQL-lausekkeen toinen osa on avainsana UNION, joka kertoo Accessille, että tämä kysely yhdistää nämä kaksi tietuejoukkoa.
Tämän SQL-lausekkeen viimeinen osa määrittää yhdistettyjen tietueiden järjestyksen käyttämällä ORDER BY -lauseketta. Tässä esimerkissä Access järjestää kaikki tietueet Tilauspäivä-kentän mukaan laskevassa järjestyksessä.
Huomautus: Yhdistämiskyselyt ovat Accessissa aina vain luku -tilassa; taulukkonäkymän mitään arvoja ei voi muuttaa.
Yhdistämiskyselyn luominen luomalla ja yhdistämällä valintakyselyitä
Vaikka voit luoda yhdistämiskyselyn kirjoittamalla suoraan SQL-syntaksia SQL-näkymään, voi olla helpompaa rakentaa se osissa valintakyselyistä. Voit sitten kopioida ja liittää SQL-osat yhdistetyksi yhdistämiskyselyksi.
Jos haluat ohittaa työvaiheiden lukemisen ja katsella sen sijaan esimerkkiä, siirry seuraavaan osaan: Katso esimerkki yhdistämiskyselyn luomisesta.
-
Valitse Luo-välilehden Kyselyt-ryhmässä Kyselyn rakennenäkymä.
-
Kaksoisnapsauta taulukkoa, joka sisältää sisällytettävät kentät. Järjestelmä lisää taulukon kyselyn suunnitteluikkunaan.
-
Kaksoisnapsauta kyselyn suunnitteluikkunassa kutakin sisällytettävää kenttää. Kun valitset kenttiä, muista lisätä sama määrä kenttiä ja samassa järjestyksessä kuin toisissa valintakyselyissä. Varmista, että kenttien tietotyypit ovat yhteensopivat toisten kyselyiden vastaavissa paikoissa olevien kenttien kanssa. Jos esimerkiksi ensimmäisessä valintakyselyssä on viisi kenttää, joista ensimmäisessä on päivämäärä/aika-arvoja, varmista, että muissa yhdistettävissä valintakyselyissä on myös viisi kenttää ja että ensimmäisessä on päivämäärä/aika-arvoja.
-
Vaihtoehtoisesti voit lisätä ehtoja kenttiin kirjoittamalla tarvittavat lausekkeet kenttäruudukon Ehdot-riville.
-
Kun olet lisännyt haluamasi kentät ja kenttien ehdot, voit suorittaa valintakyselyn ja tarkastella sen tuloksia. Valitse Rakenne-välilehden Tulokset-ryhmästä Suorita.
-
Siirry kyselyn rakennenäkymään.
-
Tallenna valintakysely ja jätä se avatuksi.
-
Toista edellä mainitut toimet kaikille yhdistettäville valintakyselyille.
Nyt, kun olet luonut valintakyselysi, on aika yhdistää ne. Tässä vaiheessa luot yhdistämiskyselyn kopioimalla ja liittämällä SQL-lausekkeita.
-
Valitse Luo-välilehden Kyselyt-ryhmässä Kyselyn rakennenäkymä.
-
Napsauta Rakenne-välilehden Kysely-ryhmässä Yhdistämiskysely. Access piilottaa kyselyn suunnitteluikkunan ja näyttää SQL-näkymän objektivälilehden. Tässä vaiheessa SQL-näkymän objektivälilehti on tyhjä.
-
Napsauta ensimmäisen yhdistämiskyselyyn lisättävän valintakyselyn välilehteä.
-
Valitse Aloitus-välilehdestä Näytä > SQL-näkymä.
-
Kopioi valintakyselyn SQL-koodi. Napsauta sen yhdistämiskyselyn välilehteä, jota aloit luoda aikaisemmin.
-
Liitä valintakyselyn SQL-koodi yhdistämiskyselyn SQL-näkymän objektivälilehteen.
-
Poista valintakyselyn SQL-lauseen lopussa oleva puolipiste (;).
-
Siirrä kohdistinta rivi alaspäin painamalla Enter-näppäintä ja kirjoita sitten uudelle riville UNION.
-
Napsauta seuraavan yhdistämiskyselyyn lisättävän valintakyselyn välilehteä.
-
Noudata vaiheita 5–10, kunnes olet kopioinut ja liittänyt kaikkien valintakyselyiden SQL-koodin yhdistämiskyselyn SQL-näkymä-ikkunaan. Älä poista viimeisen valintakyselyn lopusta puolipistettä tai lisää loppuun mitään.
-
Valitse Rakenne-välilehden Tulokset-ryhmästä Suorita.
Yhdistämiskyselyn tulos näkyy taulukkonäkymässä.
Katso esimerkki yhdistämiskyselyn luomisesta
Tässä on esimerkki, jonka voit luoda uudestaan Northwind-esimerkkitietokannassa. Tämä yhdistämiskysely kerää henkilöiden nimet Asiakkaat -taulukosta ja yhdistää nimet Toimittajat -taulukon nimiin. Jos haluat seurata mukana, suorita nämä toimenpiteet omassa Northwind-esimerkkitietokannassasi.
Seuraavassa ovat tämän esimerkin rakentamiseen välttämättömät toimet:
-
Luo kaksi valintakyselyä, Kysely1 ja Kysely2, joiden tietolähteinä toimivat vastaavasti Asiakkaat- ja Toimittajat-taulukot. Käytä Etunimi- ja Sukunimi-kenttiä näyttöarvoina.
-
Luo uusi kysely, Kysely3, jolla ei aluksi ole tietolähdettä, ja tee tästä kyselystä sitten yhdistämiskysely napsauttamalla Yhdistämiskysely -komentoa Rakenne-välilehdessä.
-
Kopioi ja liitä Kysely1:n ja Kysely2:n SQL-lausekkeet Kysely3:een. Muista poistaa ylimääräinen puolipiste ja lisätä avainsana UNION. Voit sitten tarkistaa tuloksesi taulukkonäkymässä.
-
Lisää yhteen kyselyistä järjestämislauseke ja liitä sitten ORDER BY -lauseke yhdistämiskyselyn SQL-näkymään. Huomaa, että Kysely3:ssa, yhdistämiskyselyssä, tulee ennen järjestämisen liittämistä poistaa ensin puolipisteet ja sitten taulukon nimi kenttien nimistä.
-
Lopullinen SQL, joka yhdistää ja lajittelee nimet tätä yhdistämiskyselyä varten, on seuraava:
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];
Jos olet hyvin tottunut kirjoittamaan SQL-syntaksia, voit varmasti kirjoittaa oman SQL-lausekkeesi yhdistämiskyselyä varten suoraan SQL-näkymään. Voi kuitenkin olla hyödyllistä kopioida ja liittää SQL:ää muista kyselyobjekteista. Kyselyt voivat olla hyvinkin paljon mutkikkaampia kuin tässä käytetyt yksinkertaiset valintakyselyesimerkit. Voi olla edullista luoda ja testata kukin kysely huolella etukäteen ennen niiden yhdistämistä yhdistämiskyselyksi. Jos yhdistämiskysely ei toimi, voit muokata kumpaakin kyselyä erikseen, kunnes se onnistuu, ja rakentaa sitten uudelleen yhdistämiskyselysi korjatun syntaksin avulla.
Tutustumalla tämän artikkelin jäljellä oleviin osiin saat lisää vihjeitä ja ohjeita yhdistämiskyselyjen käytöstä.
Edellisen osion Northwind-tietokantaa käyttävässä esimerkissä yhdistetään tietoa vain kahdesta taulukosta. Voit kuitenkin yhdistää kolme tai enemmän taulukoita yhdistämiskyselyksi hyvin helposti. Edelliseen esimerkkiin viitaten: haluat ehkä sisällyttää myös työntekijöiden nimet kyselyn tuloksiin. Voit tehdä tämän lisäämällä kolmannen kyselyn ja yhdistämällä edelliseen SQL-lausekkeeseen ylimääräisen UNION-avainsanan tällä tavalla:
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];
Kun tarkastelet tulosta taulukkonäkymässä, kaikki työntekijät luetteloidaan saman yritysnimen yhteydessä, mikä ei välttämättä ole kovin hyödyllistä. Jos haluat kentän ilmaisevan, onko joku oman yrityksen, toimittajan tai asiakasyrityksen työntekijä, voit käyttää kiinteää arvoa yrityksen nimen sijasta. SQL voi silloin näyttää tältä:
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];
Tältä tulos näyttää taulukkonäkymässä. Access näyttää nämä viisi esimerkkitietuetta:
Työ |
Sukunimi |
Etunimi |
Oman yrityksen työntekijä |
Falk |
Nina |
Oman yrityksen työntekijä |
Jussila |
Laura |
Toimittaja |
Karvinen |
Tommi |
Asiakas |
Seppänen |
Harri |
Asiakas |
Nieminen |
Anttoni |
Yllä olevaa kyselyä voi pienentää ennestään, koska Access lukee tuloskenttien nimet vain yhdistämiskyselyn ensimmäisestä kyselystä. Tästä näet, että olemme poistaneet toisen ja kolmannen osakyselyn tulokset:
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];
Access-yhdistämiskyselyissä järjestäminen sallitaan vain kerran, mutta jokainen kysely voidaan suodattaa erikseen. Viittauksena edellisen osan yhdistämiskyselyyn: tässä on esimerkki, jossa olemme suodattaneet jokaisen kyselyn lisäämällä WHERE-lauseen.
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];
Vaihtamalla taulukkonäkymään saat tämän tapaisia tuloksia:
Työ |
Sukunimi |
Etunimi |
Toimittaja |
Andersson |
Liisa A. |
Oman yrityksen työntekijä |
Falk |
Nina |
Asiakas |
Hasselberg |
Jonas |
Oman yrityksen työntekijä |
Heinä-Laaksonen |
Anne |
Toimittaja |
Hermunen-Kosonen |
Anneli |
Asiakas |
Mårtensson |
Sven |
Toimittaja |
Sandberg |
Mikael |
Toimittaja |
Varvikko |
Tanja |
Oman yrityksen työntekijä |
Viljanen |
Teemu |
Toimittaja |
Valtanen |
Kaija |
Oman yrityksen työntekijä |
Saari |
Roope |
Jos yhdistetyt kyselyt ovat hyvin erilaisia, saatat joutua tilanteeseen, jossa tuloskenttään on yhdistettävä useita eri tietotyyppejä. Jos näin käy, yhdistämiskysely antaa tulokset tekstimuodossa, koska tämä tietotyyppi voi sisältää sekä tekstiä että lukuja.
Tämän havainnollistamiseksi käytämme Northwind-esimerkkitietokannan Tuotetapahtumat -yhdistämiskyselyä. Avaa esimerkkitietokanta ja avaa sitten Tuotetapahtumat-kysely taulukkonäkymässä. Viimeisten kymmenen tietueen pitäisi olla samankaltaisia kuin tämä tulos:
Tuotetunnus |
Tilauksen päivämäärä |
Yrityksen nimi |
Tapahtuma |
Määrä |
77 |
22.1.2006 |
Toimittaja B |
Ostaminen |
60 |
80 |
22.1.2006 |
Toimittaja D |
Ostaminen |
75 |
81 |
22.1.2006 |
Toimittaja A |
Ostaminen |
125 |
81 |
22.1.2006 |
Toimittaja A |
Ostaminen |
200 |
7 |
20.1.2006 |
Yritys D |
Myynti |
10 |
51 |
20.1.2006 |
Yritys D |
Myynti |
10 |
80 |
20.1.2006 |
Yritys D |
Myynti |
10 |
34 |
15.1.2006 |
Yritys AA |
Myynti |
100 |
80 |
15.1.2006 |
Yritys AA |
Myynti |
30 |
Oletetaan,että haluat jakaa Määrä-kentän kahtia: Osta ja Myy. Oletetaan myös, että haluat määrittää kiinteän nolla-arvon kentälle ilman arvoa. Tältä näyttää tämän yhdistämiskyselyn SQL:
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;
Jos vaihdat taulukkonäkymään, näet viimeiset kymmenen näytettävää tietuetta näin:
Tuotetunnus |
Tilauksen päivämäärä |
Yrityksen nimi |
Tapahtuma |
Osta |
Myy |
74 |
22.1.2006 |
Toimittaja B |
Ostaminen |
20 |
0 |
77 |
22.1.2006 |
Toimittaja B |
Ostaminen |
60 |
0 |
80 |
22.1.2006 |
Toimittaja D |
Ostaminen |
75 |
0 |
81 |
22.1.2006 |
Toimittaja A |
Ostaminen |
125 |
0 |
81 |
22.1.2006 |
Toimittaja A |
Ostaminen |
200 |
0 |
7 |
20.1.2006 |
Yritys D |
Myynti |
0 |
10 |
51 |
20.1.2006 |
Yritys D |
Myynti |
0 |
10 |
80 |
20.1.2006 |
Yritys D |
Myynti |
0 |
10 |
34 |
15.1.2006 |
Yritys AA |
Myynti |
0 |
100 |
80 |
15.1.2006 |
Yritys AA |
Myynti |
0 |
30 |
Jatketaan samaa esimerkkiä: entä jos haluat nollan sisältävien kenttien olevan tyhjiä? Voit muokata SQL:n näyttämään tyhjää nollan sijasta käyttämällä seuraavalla tavalla avainsanaa Null:
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;
Kuitenkin, kuten olet ehkä jo huomannut vaihtaessasi taulukkonäkymään, saat nyt odottamattoman tuloksen. Osta-sarakkeen kaikki kentät poistetaan:
Tuotetunnus |
Tilauksen päivämäärä |
Yrityksen nimi |
Tapahtuma |
Osta |
Myy |
74 |
22.1.2006 |
Toimittaja B |
Ostaminen |
||
77 |
22.1.2006 |
Toimittaja B |
Ostaminen |
||
80 |
22.1.2006 |
Toimittaja D |
Ostaminen |
||
81 |
22.1.2006 |
Toimittaja A |
Ostaminen |
||
81 |
22.1.2006 |
Toimittaja A |
Ostaminen |
||
7 |
20.1.2006 |
Yritys D |
Myynti |
10 |
|
51 |
20.1.2006 |
Yritys D |
Myynti |
10 |
|
80 |
20.1.2006 |
Yritys D |
Myynti |
10 |
|
34 |
15.1.2006 |
Yritys AA |
Myynti |
100 |
|
80 |
15.1.2006 |
Yritys AA |
Myynti |
30 |
Tämä johtuu siitä, että Access määrittää tietotyypit ensimmäisen kyselyn kenttien mukaan. Tässä esimerkissä Null ei ole luku.
Mitä tapahtuu, jos yrität lisätä tyhjän merkkijonon kenttiin, joiden arvo on tyhjä? Tällöin SQL voi näyttää tältä:
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;
Kun siirryt taulukkonäkymään, näet, että Access hakee Osta-arvot, mutta muuttaa ne tekstiksi. Näet, että nämä ovat tekstiarvoja, koska ne tasataan taulukkonäkymässä vasemmalle. Ensimmäisen kyselyn tyhjä merkkijono ei ole luku, ja tämän takia näet nämä tulokset. Huomaat senkin, että myös Myy-arvot muunnetaan tekstimuotoon, koska ostamistietueet sisältävät tyhjän merkkijonon.
Tuotetunnus |
Tilauksen päivämäärä |
Yrityksen nimi |
Tapahtuma |
Osta |
Myy |
74 |
22.1.2006 |
Toimittaja B |
Ostaminen |
20 |
|
77 |
22.1.2006 |
Toimittaja B |
Ostaminen |
60 |
|
80 |
22.1.2006 |
Toimittaja D |
Ostaminen |
75 |
|
81 |
22.1.2006 |
Toimittaja A |
Ostaminen |
125 |
|
81 |
22.1.2006 |
Toimittaja A |
Ostaminen |
200 |
|
7 |
20.1.2006 |
Yritys D |
Myynti |
10 |
|
51 |
20.1.2006 |
Yritys D |
Myynti |
10 |
|
80 |
20.1.2006 |
Yritys D |
Myynti |
10 |
|
34 |
15.1.2006 |
Yritys AA |
Myynti |
100 |
|
80 |
15.1.2006 |
Yritys AA |
Myynti |
30 |
Miten tämä ongelma siis ratkaistaan?
Yksi mahdollisuus on pakottaa kysely olettamaan, että kentän arvo on luku. Tämä voidaan tehdä seuraavalla lausekkeella:
IIf(False, 0, Null)
Tarkistettava ehto, Epätosi, ei koskaan ole Tosi, joten lauseke palauttaa aina arvon Null, mutta Access arvioi silti molemmat tulosvaihtoehdot ja määrittää tulokseksi joko numeroarvon tai Null-arvon.
Näin voimme käyttää tätä lauseketta käyttöesimerkissämme:
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;
Huomaa, ettei toista kyselyä ole välttämätöntä muokata.
Jos vaihdat taulukkonäkymään, saamme haluamamme tuloksen:
Tuotetunnus |
Tilauksen päivämäärä |
Yrityksen nimi |
Tapahtuma |
Osta |
Myy |
74 |
22.1.2006 |
Toimittaja B |
Ostaminen |
20 |
|
77 |
22.1.2006 |
Toimittaja B |
Ostaminen |
60 |
|
80 |
22.1.2006 |
Toimittaja D |
Ostaminen |
75 |
|
81 |
22.1.2006 |
Toimittaja A |
Ostaminen |
125 |
|
81 |
22.1.2006 |
Toimittaja A |
Ostaminen |
200 |
|
7 |
20.1.2006 |
Yritys D |
Myynti |
10 |
|
51 |
20.1.2006 |
Yritys D |
Myynti |
10 |
|
80 |
20.1.2006 |
Yritys D |
Myynti |
10 |
|
34 |
15.1.2006 |
Yritys AA |
Myynti |
100 |
|
80 |
15.1.2006 |
Yritys AA |
Myynti |
30 |
Vaihtoehtoinen tapa päästä samaan tulokseen on lisätä yhdistämiskyselyn osakyselyiden eteen vielä yksi kysely:
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 palauttaa määrittelemäsi tietotyypin kiinteän arvon kullekin kentälle. Et tietenkään halua tämän kyselyn tuloksen sotkevan tuloksia, ja tämän vältät lisäämällä Epätoteen WHERE-lauseen:
WHERE False
Tämä on pikkuista huiputusta, sillä tämä on aina epätosi eikä kysely tällöin palauta mitään. Kun tämä lauseke yhdistetään aiemmin luotuun SQL:ään, saadaan seuraavanlainen kokonaislauseke:
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;
Huomautus: Tämä esimerkissä esiintyvä yhdistetty kysely palauttaa Northwind-tietokantaa käytettäessä 100 tietuetta, kun taas yksittäiset kyselyt palauttavat 58 ja 43 tietuetta, yhteensä 101 tietuetta. Ero johtuu siitä, että kaksi tietuetta ei ole yksilöllisiä. Katso osaa Erillisten tietueiden käyttäminen yhdistämiskyselyissä UNION ALLin avulla, niin saat tietää, miten voit ratkaista tämän tilanteen käyttämällä UNION ALLia.
Yhdistämiskyselyn erikoistapauksessa yhdistetään joukko tietueita yhteen tietueeseen, joka sisältää yhden tai useamman kentän summan.
Tässä on toinen esimerkki, jonka voit luoda Northwind-esimerkkitietokannassa havainnollistamaan sitä, miten yhdistämiskyselyssä saadaan summa.
-
Luo uusi yksinkertainen kysely ja tarkastele sen avulla oluen ostamista (tuotetunnus 34 Northwind-tietokannassa) käyttämällä seuraavaa SQL-syntaksia:
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];
-
Siirtymällä taulukkonäkymään sinun pitäisi nähdä neljä ostoa:
Vastaanottopäivämäärä
Määrä
22.1.2006
100
22.1.2006
60
4.4.2006
50
5.4.2006
300
-
Kun haluat saada summan, luo yksinkertainen yhdistävä kysely käyttämällä seuraavaa SQL:ää:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))
-
Siirtymällä taulukkonäkymään sinun pitäisi nähdä vain yksi tietue:
MaxOfDate Received
SumOfQuantity
5.4.2006
510
-
Yhdistämällä nämä kaksi kyselyä yhdistämiskyselyyn voit lisätä tietueen, joka sisältää ostamistietueiden määrien summan:
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];
-
Siirtymällä taulukkonäkymään sinun pitäisi nähdä kaikki neljä ostoa niin, että jokaisen summaa seuraa kokonaissummatietue:
Vastaanottopäivämäärä
Määrä
22.1.2006
60
22.1.2006
100
4.4.2006
50
5.4.2006
300
5.4.2006
510
Tässä olemme käsitelleet perustiedot summien lisäämisestä yhdistämiskyselyyn. Haluat ehkä myös sisällyttää molempiin kyselyihin kiinteitä arvoja, kuten ”Yksittäinen” ja ”Kokonaissumma” summatietueen erottamiseksi muista tietueista. Voit kerrata kiinteiden arvojen käyttöä kohdassa Kolmen tai useamman taulukon tai kyselyn yhdistäminen yhdistämiskyselyssä.
Accessin yhdistämiskyselyt sisältävät oletusarvoisesti vain erillisiä tietueita. Mutta entä jos haluat sisällyttää kaikki tietueet? Kannattaa ottaa tässä esille uusi esimerkki.
Edellisessä osassa näytimme, miten voit luoda kokonaissumman yhdistämiskyselyssä. Muokkaa tämän yhdistämiskyselyn SQL:ää niin, että siihen sisältyy tuotetunnus 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];
Siirtymällä taulukkonäkymään sinun pitäisi nähdä hieman harhaanjohtava tulos:
Vastaanottopäivämäärä |
Määrä |
22.1.2006 |
100 |
22.1.2006 |
200 |
Yksi tietue ei tietenkään palauta kokonaismäärää kaksinkertaisena.
Näet tämän tuloksen siksi, että yhtenä päivänä sama suklaamäärä on myyty kahdesti - kuten ostotilaustietojen taulukkoon on merkitty. Tässä on yksinkertainen valintakyselytulos, joka näyttää molemmat tietueet Northwind-esimerkkitietokannasta:
Ostotilaustunnus |
Tuote |
Määrä |
100 |
Northwind Traders Chocolate |
100 |
92 |
Northwind Traders Chocolate |
100 |
Edellä mainitussa yhdistämiskyselyssä näet, että ostotilaustunnuksen kenttää ei ole mukana ja että kaksi kenttää eivät ole kaksi erillistä tietuetta.
Jos haluat sisällyttää kaikki tietueet, käytä SQL:ssäsi avainsanaa UNION ALL pelkän UNIONin sijasta. Tämä vaikuttaa todennäköisesti tulosten lajitteluun, joten voi olla järkevää sisällyttää myös ORDER BY -lause lajittelujärjestyksen määrittämiseksi. Tässä on edelliseen esimerkkiin perustuva muokattu SQL:
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];
Siirtymällä taulukkonäkymään sinun pitäisi nähdä kaikki yksittäiset kohteet sekä viimeisenä tietueena kokonaissumma:
Vastaanottopäivämäärä |
Summa |
Määrä |
22.1.2006 |
100 |
|
22.1.2006 |
100 |
|
22.1.2006 |
Summa |
200 |
Yleinen tapa käyttää yhdistämiskyselyä on käyttää sitä tietuelähteenä lomakkeen yhdistelmäruudun ohjausobjektille. Yhdistelmäruutua käyttäen voit valita arvon lomakkeen tietueiden suodattamista varten. Voit esimerkiksi suodattaa työntekijöiden tietueet heidän kaupunkinsa mukaan.
Tarkastele tätä esimerkkiä, jonka voit luoda Northwind-esimerkkitietokannassa tämän tilanteen havainnollistamiseksi.
-
Luo yksinkertainen valintakysely tätä SQL-syntaksia käyttämällä:
SELECT Employees.City, Employees.City AS Filter FROM Employees;
-
Siirtymällä taulukkonäkymään sinun pitäisi nähdä seuraavat tulokset:
Kaupunki
Suodatin
Vaasa
Vaasa
Kotka
Kotka
Turku
Turku
Tampere
Tampere
Vaasa
Vaasa
Turku
Turku
Vaasa
Vaasa
Turku
Turku
Vaasa
Vaasa
-
Nämä tulokset eivät ehkä näytä kovin arvokkailta. Laajenna kuitenkin kyselyä ja muuta se yhdistämiskyselyksi käyttämällä seuraavaa SQL:ää:
SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;
-
Siirtymällä taulukkonäkymään sinun pitäisi nähdä seuraavat tulokset:
Kaupunki
Suodatin
<Kaikki>
*
Kotka
Kotka
Tampere
Tampere
Turku
Turku
Vaasa
Vaasa
Access suorittaa yhdeksän edellä näytetyn tietueen yhdistämiskyselyn käyttämällä kiinteitä kenttäarvoja <Kaikki> ja ”*”.
Koska tämä yhdistämiskyselylause ei sisällä avainsanaa UNION ALL, Access palauttaa vain erilliset tietueet, mikä tarkoittaa, että jokainen kaupunki palautetaan vain kerran kiinteine, samanlaisine arvoineen.
-
Nyt kun sinulla on valmis yhdistämiskysely, joka näyttää jokaisen kaupungin nimen vain kerran, sekä asetus, joka käytännössä valitsee kaikki kaupungit, voit käyttää tätä kyselyä tietuelähteenä lomakkeen yhdistelmäruudulle. Käyttämällä tätä erityisesimerkkiä mallina voit luoda lomakkeelle yhdistelmäruudun ohjausobjektin, määrittää tämän kyselyn sen tietuelähteeksi, määrittää Suodatin-sarakkeen sarakkeenleveysominaisuuden malliksi 0 (nolla) sen piilottamiseksi katseilta ja määrittää Sidottu sarake -ominaisuuden arvoksi 1 toisen sarakkeen indeksin. Lomakkeen oman suodatinominaisuuden kautta voit sitten lisätä esimerkiksi seuraavanlaisen koodin lomakkeen suodattimen aktivoimiseksi käyttämällä yhdistelmäruudun ohjausobjektissa valittua arvoa:
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
Lomakkeen käyttäjä voi sitten suodattaa lomaketietueet, joissa on tietyn kaupungin nimi, tai valita <Kaikki> ja luetteloida kaikkien kaupunkien tietueet.