Dažkārt, iespējams, vēlēsities apvienot ierakstus no vienas tabulas vai vaicājuma ar ierakstiem no vienas vai vairākām citām tabulām vienā rezultātā. Apvienošanas vaicājums to dara programmā Access.
Lai efektīvi izprastu apvienošanas vaicājumus, vispirms apgūstiet vienkāršu atlases vaicājumu noformēšanu programmā Access. Papildinformāciju par atlases vaicājumu noformēšanu skatiet rakstā Vienkārša atlases vaicājuma izveide.
Apvienošanas vaicājuma piemēra, kas darbojas, izpēte
Ja iepriekš nekad neesat veidojis apvienošanas vaicājumu, būtu noderīgi vispirms izpētīt Northwind Access veidnē iekļautu piemēru, kas darbojas. Northwind veidnes paraugu varat meklēt Access darba sākšanas lapā, atlasot Fails>Jauns. Varat arī lejupielādēt kopiju tieši no Northwind parauga veidnes.
Kad programma Access atver Northwind datu bāzi, aizveriet pieteikšanās dialoglodziņu, kas tiek parādīts pirmais, un pēc tam izvērsiet navigācijas rūti. Atlasiet navigācijas rūts augšdaļu un pēc tam atlasiet Objekta tips , lai kārtotu visus datu bāzes objektus pēc tipa. Pēc tam izvērsiet grupu Vaicājumi , lai redzētu vaicājumu ar nosaukumu Darījumi ar precēm.
Apvienošanas vaicājumus var viegli atšķirt no citiem vaicājumu objektiem, jo tiem ir īpaša ikona, kas līdzinās diviem savstarpēji savietotiem apļiem, kuri atveido divu kopu apvienojuma kopu:
Atšķirībā no parastajiem atlases un darbību vaicājumiem, apvienošanas vaicājumā tabulas nav saistītas. Tas nozīmē, ka Access grafisko vaicājumu noformētāju nevar izmantot, lai veidotu vai rediģētu apvienošanas vaicājumus. Atverot apvienošanas vaicājumu no navigācijas rūts, programma Access to atver un rezultātus parāda datu lapas skatā. Cilnes Sākums sadaļā Skati ievērojiet, ka noformējuma skats nav pieejams, kad strādājat ar apvienošanas vaicājumiem. Varat pārslēgties tikai starp datu lapas skatu un SQL skatu.
Lai turpinātu savu šī apvienošanas vaicājuma piemēra izpēti, noklikšķiniet uz Sākums>skati>SQL skatsSQL un skatiet sintaksi, kas to definē. Šajā attēlā pievienojām dažas papildu atstarpes SQL , lai jūs ērtāk varētu atšķirt dažādās daļas, kas veido apvienošanas vaicājumu.
Detalizēti izskatīsim SQL šī Northwind datu bāzes apvienošanas vaicājuma sintaksi:
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;
Šī SQL priekšraksta pirmā un trešā daļa pēc būtības ir divi atlases vaicājumi. Šie vaicājumi izgūst divas dažādas ierakstu kopas: vienu no tabulas Preču pasūtījumi un otru no tabulas Preču pirkumi.
Otrā šī priekšraksta SQL daļa ir atslēgvārds UNION , kas programmai Access liek apvienot šīs divas ierakstu kopas.
Pēdējā šī SQL priekšraksta daļa nosaka apvienoto ierakstu secību, izmantojot ORDER BY priekšrakstu. Šajā piemērā Access visus ierakstus dilstošā secībā kārto pēc lauka Pasūtījuma datums.
Piezīme
Programmā Access apvienošanas vaicājumi vienmēr ir tikai lasāmi; datu lapas skatā jūs nevarat mainīt nekādas vērtības.
Apvienošanas vaicājuma izveide, veidojot un kombinējot atlases vaicājumus
Lai gan apvienošanas vaicājumu varat izveidot, rakstot SQL sintaksi tieši SQL skatā, iespējams, ērtāk būs veidot to pa daļām, izmantojot atlases vaicājumus. Pēc tam šīs SQL koda daļas varat kopēt un ielīmēt kombinētajā apvienošanas vaicājumā.
Ja vēlaties izlaist darbību aprakstu un tā vietā noskatīties piemēru, skatiet nākamo sadaļu Apvienošanas vaicājuma veidošanas piemēra skatīšanās.
- Cilnes Izveide grupā Vaicājumi noklikšķiniet uz Vaicājuma noformējums.
- Veiciet dubultklikšķi uz tabulas, kuras laukus vēlaties iekļaut vaicājumā. Tabula tiks pievienota vaicājuma noformējuma logā.
- Vaicājuma noformējuma logā veiciet dubultklikšķi uz katra lauka, kuru vēlaties iekļaut. Atlasot laukus, pārliecinieties, vai pievienojat tādu pašu lauku skaitu tādā pašā secībā, kādu pievienojat citiem atlases vaicājumiem. Pievērsiet uzmanību lauku datu tipiem un pārliecinieties, vai tiem ir saderīgi datu tipi ar laukiem, kas atrodas tādā pašā pozīcijā citos kombinētajos vaicājumos. Piemēram, ja pirmajā atlases vaicājumā ir pieci lauki, no kuriem pirmajā ir datuma/laika dati, pārliecinieties, vai arī visiem pārējiem atlases vaicājumiem, kurus kombinējat, ir pieci lauki, no kuriem pirmajā ir datuma/laika dati utt.
- Ja vēlaties, pievienojiet kritērijus saviem laukiem, lauku režģa rindā Kritēriji ierakstot atbilstošas izteiksmes.
- Pēc lauku un to kritēriju pievienošanas izpildiet šo atlases vaicājumu un pārskatiet tā izvadi. Cilnes Noformējums grupā Rezultāti noklikšķiniet uz Izpildīt.
- Ieslēdziet noformējuma skatu.
- Saglabājiet atlases vaicājumu, bet neaizveriet to.
- Atkārtojiet šoi procedūru ar katru apvienošanai paredzēto atlases vaicājumu.
Tagad, kad esat izveidojis savus atlases vaicājumus, ir pienācis laiks tos kombinēt. Šajā darbībā izveidosit apvienošanas vaicājumu, kopējot un ielīmējot SQL priekšrakstus.
- Cilnes Izveide grupā Vaicājumi noklikšķiniet uz Vaicājuma noformējums.
- Cilnes Noformējums grupā Vaicājums noklikšķiniet uz Apvienošanas vaicājums. Programma Access paslēpj vaicājuma noformējuma logu un parāda SQL skata objekta cilni. Šobrīd cilne ir tukša.
- Noklikšķiniet uz pirmā atlases vaicājuma cilnes, kuru vēlaties iekļaut apvienošanas vaicājumā.
- Cilnē Sākums noklikšķiniet uz Skatīt>SQL skatu.
- Kopējiet
SQLatlases vaicājuma priekšrakstu. Noklikšķiniet uz iepriekš veidot sāktā apvienošanas vaicājuma cilnes. - Ielīmējiet
SQLatlases vaicājuma priekšrakstu apvienošanas vaicājuma SQL skata objekta cilnē. - Izdzēsiet atlases vaicājuma
SQLpriekšraksta beigās iekļauto semikolu (;). - Nospiediet taustiņu Enter, lai kursoru pārvietotu vienu rindiņu zemāk, un pēc tam rakstiet
UNIONjaunajā rindiņā. - Noklikšķiniet uz nākamā iekļaušanai apvienošanas vaicājumā paredzētā atlases vaicājuma cilnes.
- Atkārtojiet šīs procedūras 5.–10. darbību, līdz apvienošanas vaicājuma SQL skata logā ir nokopēti un ielīmēti visi
SQLatlases vaicājumu priekšraksti. Neizdzēsiet pēdējā atlases vaicājuma priekšrakstaSQLbeigās esošo semikolu vai neierakstiet šajā vietā nekādas rakstzīmes. - Cilnes Noformējums grupā Rezultāti noklikšķiniet uz Izpildīt.
Apvienošanas vaicājuma rezultāti tiek parādīti datu lapas skatā.
Apvienošanas vaicājuma veidošanas piemēra skatīšanās
Lūk, piemērs, kuru varat atveidot Northwind datu bāzes paraugā. Šis apvienošanas vaicājums apkopo personu vārdus no tabulas Klienti un kombinē tos ar personu vārdiem no tabulas Piegādātāji. Ja vēlaties sekot līdzi, veiciet šīs darbības savā Northwind datu bāzes parauga kopijā.
Lūk, darbības, kas nepieciešamas, lai izveidotu šo piemēru:
Izveidojiet divus atlases vaicājumus ar nosaukumu Vaicājums1 un Vaicājums2, kuru datu avots atbilstoši ir tabula Klienti un Piegādātāji. Kā parādāmās vērtības izmantojiet lauku Vārds un Uzvārds.
Izveidojiet jaunu vaicājumu ar nosaukumu Vaicājums3, kuram sākotnēji nav datu avota, un pēc tam cilnē Noformējums noklikšķiniet uz komandas Apvienošana, lai šo vaicājumu padarītu par apvienošanas vaicājumu.
Vaicājumā Vaicājums3 kopējiet un ielīmējiet SQL priekšrakstus no Vaicājums1 un Vaicājums2. Noteikti noņemiet papildu semikolu un pievienojiet atslēgvārdu
UNION. Pēc tam datu lapas skatā varat pārbaudīt rezultātus.Vienam no vaicājumiem pievienojiet kārtošanas klauzulu un pēc tam SQL skata apvienošanas vaicājumā ielīmējiet
ORDER BYpriekšrakstu. Ievērojiet, ka apvienošanas vaicājumā Vaicājums3 pirms pašas kārtošanas vispirms tiek noņemti semikoli, pēc tam no lauku nosaukumiem tiek izņemts tabulas nosaukums.Beidzamais
SQLaspekts, kurā tiek kombinēti un kārtoti nosaukumi šajā apvienošanas vaicājuma piemērā, ir šāds: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];
Ja sintakses rakstīšana SQL jums nesagādā problēmas, savu priekšrakstu apvienošanas vaicājumam varat uzrakstīt SQL tieši SQL skatā. Tomēr SQL kods no citiem vaicājumu objektiem kopēšanas un ielīmēšanas paņēmiens jums varētu šķist noderīgs. Katrs vaicājums var būt ievērojami sarežģītāks par šeit izmantotajiem vienkāršajiem atlases vaicājumu piemēriem. Varētu būt noderīgi izveidot un uzmanīgi notestēt visus vaicājumus, pirms tie tiek kombinēti apvienošanas vaicājumā. Ja apvienošanas vaicājuma izpilde neizdodas, katru vaicājumu varat pielāgot atsevišķi, līdz tas izdodas, un pēc tam atkārtoti izveidot savu apvienošanas vaicājumu ar izlabotu sintaksi.
Pārskatiet atlikušās šī raksta sadaļas, lai apgūtu citus padomus un ieteikumus, kā lietot apvienošanas vaicājumus.
Trīs un vairāk tabulu vai vaicājumu kombinēšana apvienošanas vaicājumā
Iepriekšējās sadaļas piemērā, kurā tiek izmantota Northwind datu bāze, dati tiek kombinēti tikai no divām tabulām. Tomēr apvienošanas vaicājums ļauj ērti kombinēt trīs tabulas un vairāk. Piemēram, papildinot iepriekšējo piemēru, vaicājuma rezultātos varat iekļaut arī darbinieku vārdus. Šo uzdevumu varat paveikt, pievienojot trešo vaicājumu un kombinējot iepriekšējo SQL priekšrakstu ar papildu atslēgvārdu UNION, piemēram, šādi:
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];
Kad skatīsit rezultātus datu lapas skatā, visi darbinieki tiks uzskaitīti, norādot parauga uzņēmuma nosaukumu, kas, iespējams, nav īpaši noderīgi. Ja vēlaties, lai būtu šāds lauks, kas parāda, vai persona ir uzņēmuma darbinieks, piegādātājs vai klients, uzņēmuma nosaukuma vietā varat iekļaut fiksētu vērtību . Lūk, kā tas SQL izskatās:
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];
Lūk, kā rezultāti tiek rādīti datu lapas skatā. Programma Access parāda šos piecus piemēra ierakstus:
| Nodarbinātība | Uzvārds | Vārds |
|---|---|---|
| Uzņēmumā | Krieva | Agrita |
| Uzņēmumā | Kaņepa | Daniela |
| Piegādātājs | Lūsis | Nikolajs |
| Klients | Vīksna | Laimonis |
| Klients | Podnieks | Ritums |
Vaicājumu var samazināt vēl vairāk, jo Access apvienošanas vaicājumā lasa izvades lauku nosaukumus tikai no pirmā vaicājuma. Šeit tiek noņemta izvade no otrās un trešās vaicājuma sadaļas:
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];
Filtrēšana apvienošanas vaicājumos
Access apvienošanas vaicājumā kārtošana ir atļauta tikai vienu reizi, bet katru vaicājumu var filtrēt atsevišķi. Turpinot iepriekšējās sadaļas apvienošanas vaicājuma pārveidi, lūk, piemērs, kurā katrs vaicājums tiek filtrēts, pievienojot klauzulu 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];
Pārslēdzieties uz datu lapas skatu un redzēsit šiem līdzīgus rezultātus:
| Nodarbinātība | Uzvārds | Vārds |
|---|---|---|
| Piegādātājs | Jaunzema | Aira |
| Uzņēmumā | Krieva | Agrita |
| Klients | Roze | Kazimirs |
| Uzņēmumā | Lapsa | Aisma |
| Piegādātājs | Ziemele | Irbe |
| Klients | Turins | Teodors |
| Piegādātājs | Saulītis | Sarmis |
| Piegādātājs | Lagzdiņš | Andis |
| Uzņēmumā | Auniņš | Nils |
| Piegādātājs | Zvirbule | Alīda |
| Uzņēmumā | Vītols | Alfons |
Datu tipu jaukšana
Ja apvienotie vaicājumi ir ļoti atšķirīgi, var rasties situācija, kur izvades laukā ir jākombinē dati ar dažādiem datu tipiem. Šādā gadījumā, apvienošanas vaicājums visbiežāk atgriezīs rezultātus ar teksta datu tipu, jo šis datu tips var ietvert tekstu un skaitļus.
Lai saprastu, kā tas darbojas, izmantosim Northwind datu bāzes parauga apvienošanas vaicājumu Darījumi ar precēm. Atveriet šo datu bāzes paraugu un pēc tam datu lapas skatā atveriet vaicājumu Darījumi ar precēm. Pēdējiem desmit ierakstiem ir jābūt līdzīgiem šai izvadei:
| Produkta ID | Pasūtījuma datums | Uzņēmuma nosaukums | Darījums | Daudzums |
|---|---|---|---|---|
| 77 | 22.01.2006. | Piegādātājs B | Iegāde | 60 |
| 80 | 22.01.2006. | Piegādātājs D | Iegāde | 75 |
| 81 | 22.01.2006. | Piegādātājs A | Iegāde | 125 |
| 81 | 22.01.2006. | Piegādātājs A | Iegāde | 200 |
| 7 | 20.01.2006. | Uzņēmums D | Pārdošana | 10 |
| 51 | 20.01.2006. | Uzņēmums D | Pārdošana | 10 |
| 80 | 20.01.2006. | Uzņēmums D | Pārdošana | 10 |
| 34 | 15.01.2006. | Uzņēmums AA | Pārdošana | 100 |
| 80 | 15.01.2006. | Uzņēmums AA | Pārdošana | 30 |
Pieņemsim, ka vēlaties lauku Daudzums sadalīt divos laukos: Iegāde un Pārdošana. Pieņemsim arī to, ka laukā bez vērtības vēlaties noteikt fiksētu nulles vērtību. Lūk, kā izskatās SQL šis apvienošanas vaicājums:
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;
Ja pārslēgsities uz datu lapas skatu, redzēsit, ka pēdējie desmit ieraksti tagad ir līdzīgi šiem:
| Produkta ID | Pasūtījuma datums | Uzņēmuma nosaukums | Darījums | Iegāde | Pārdošana |
|---|---|---|---|---|---|
| 74 | 22.01.2006. | Piegādātājs B | Iegāde | 20 | 0 |
| 77 | 22.01.2006. | Piegādātājs B | Iegāde | 60 | 0 |
| 80 | 22.01.2006. | Piegādātājs D | Iegāde | 75 | 0 |
| 81 | 22.01.2006. | Piegādātājs A | Iegāde | 125 | 0 |
| 81 | 22.01.2006. | Piegādātājs A | Iegāde | 200 | 0 |
| 7 | 20.01.2006. | Uzņēmums D | Pārdošana | 0 | 10 |
| 51 | 20.01.2006. | Uzņēmums D | Pārdošana | 0 | 10 |
| 80 | 20.01.2006. | Uzņēmums D | Pārdošana | 0 | 10 |
| 34 | 15.01.2006. | Uzņēmums AA | Pārdošana | 0 | 100 |
| 80 | 15.01.2006. | Uzņēmums AA | Pārdošana | 0 | 30 |
Turpinot šo piemēru: ko darīt, ja vēlaties, lai lauki ar nulles vērtībām būtu tukši? Varat modificēt, SQL lai nulles vietā nerādītu neko, pievienojot atslēgvārdu Null , kā parādīts šeit:
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;
Tomēr, kā, iespējams, jau novērojāt, pārslēdzoties uz datu lapas skatu, tagad ir neparedzēti rezultāti. Kolonnā Iegāde visi lauki ir notīrīti:
| Produkta ID | Pasūtījuma datums | Uzņēmuma nosaukums | Darījums | Iegāde | Pārdošana |
|---|---|---|---|---|---|
| 74 | 22.01.2006. | Piegādātājs B | Iegāde | ||
| 77 | 22.01.2006. | Piegādātājs B | Iegāde | ||
| 80 | 22.01.2006. | Piegādātājs D | Iegāde | ||
| 81 | 22.01.2006. | Piegādātājs A | Iegāde | ||
| 81 | 22.01.2006. | Piegādātājs A | Iegāde | ||
| 7 | 20.01.2006. | Uzņēmums D | Pārdošana | 10 | |
| 51 | 20.01.2006. | Uzņēmums D | Pārdošana | 10 | |
| 80 | 20.01.2006. | Uzņēmums D | Pārdošana | 10 | |
| 34 | 15.01.2006. | Uzņēmums AA | Pārdošana | 100 | |
| 80 | 15.01.2006. | Uzņēmums AA | Pārdošana | 30 |
Tas notiek tāpēc, ka Access lauku datu tipus nosaka, izmantojot pirmo vaicājumu. Šajā piemērā Null nav skaitlis.
Kas notiek, ja kā lauku tukšo vērtību mēģināt ievietot tukšu virkni?
SQL Šis mēģinājums varētu izskatīties šādi:
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;
Pārslēdzoties uz datu lapas skatu, redzēsit, ka Access izgūst vērtības Iegāde, bet pārvērš tās par tekstu. To, ka šīs ir teksta vērtības, varat noteikt pēc tā, ka datu lapas skatā tās ir līdzinātas pa kreisi. Tukšā virkne pirmajā vaicājumā nav skaitlis, tāpēc redzat šādus rezultātus. Ievērosit arī to, ka arī vērtības Pārdošana ir pārveidotas par tekstu, jo iegādes ierakstos ir tukša virkne.
| Produkta ID | Pasūtījuma datums | Uzņēmuma nosaukums | Darījums | Iegāde | Pārdošana |
|---|---|---|---|---|---|
| 74 | 22.01.2006. | Piegādātājs B | Iegāde | 20 | |
| 77 | 22.01.2006. | Piegādātājs B | Iegāde | 60 | |
| 80 | 22.01.2006. | Piegādātājs D | Iegāde | 75 | |
| 81 | 22.01.2006. | Piegādātājs A | Iegāde | 125 | |
| 81 | 22.01.2006. | Piegādātājs A | Iegāde | 200 | |
| 7 | 20.01.2006. | Uzņēmums D | Pārdošana | 10 | |
| 51 | 20.01.2006. | Uzņēmums D | Pārdošana | 10 | |
| 80 | 20.01.2006. | Uzņēmums D | Pārdošana | 10 | |
| 34 | 15.01.2006. | Uzņēmums AA | Pārdošana | 100 | |
| 80 | 15.01.2006. | Uzņēmums AA | Pārdošana | 30 |
Kā atrisināt šo problēmu?
Viens risinājums ir piespiest vaicājumu sagaidīt, ka lauka vērtība būs skaitlis. To var izdarīt ar šo izteiksmi:
IIf(False, 0, Null)
Pārbaudāmais Falsenosacījums , nekad nav , Truetāpēc izteiksme vienmēr atgriež Null. Tomēr Access joprojām novērtē abas izvades opcijas un izvadi apstrādā kā skaitlisku vai Null.
Lūk, kā varam izmantot šo izteiksmi savā piemērā, kas darbojas:
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;
Nav jāmodificē otrais vaicājums.
Ja pārslēgsities uz datu lapas skatu, tagad redzēsit nepieciešamo rezultātu:
| Produkta ID | Pasūtījuma datums | Uzņēmuma nosaukums | Darījums | Iegāde | Pārdošana |
|---|---|---|---|---|---|
| 74 | 22.01.2006. | Piegādātājs B | Iegāde | 20 | |
| 77 | 22.01.2006. | Piegādātājs B | Iegāde | 60 | |
| 80 | 22.01.2006. | Piegādātājs D | Iegāde | 75 | |
| 81 | 22.01.2006. | Piegādātājs A | Iegāde | 125 | |
| 81 | 22.01.2006. | Piegādātājs A | Iegāde | 200 | |
| 7 | 20.01.2006. | Uzņēmums D | Pārdošana | 10 | |
| 51 | 20.01.2006. | Uzņēmums D | Pārdošana | 10 | |
| 80 | 20.01.2006. | Uzņēmums D | Pārdošana | 10 | |
| 34 | 15.01.2006. | Uzņēmums AA | Pārdošana | 100 | |
| 80 | 15.01.2006. | Uzņēmums AA | Pārdošana | 30 |
Alternatīvs veids, kā panākt to pašu rezultātu, ir apvienošanas vaicājuma vaicājumu sākumā pievienot citu vaicājumu:
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
Katram laukam Access atgriež fiksētas jūsu definētā datu tipa vērtības. Protams, jūs nevēlaties, lai šī vaicājuma izvade iejauktos rezultātos, tāpēc, lai no tā izvairītos, pie Aplams ir jāiekļauj klauzula WHERE:
WHERE False
Tas ir mazs triks. Tā kā nosacījums vienmēr ir aplams, vaicājums neko neatgriež. Kombinējot šo priekšrakstu ar esošo SQL kodu, mēs iegūstam šādu pabeigtu priekšrakstu:
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;
Piezīme
Šajā piemērā kombinētais vaicājums Northwind datu bāzē atgriež 100 ierakstu, bet abi atsevišķie vaicājumi atgriež 58 un 43 ierakstus, kuru kopsumma ir 101 ieraksts. Šī atšķirība rodas tāpēc, ka divi ieraksti nav unikāli.
Skatiet sadaļu Darbs ar atšķirīgiem ierakstiem apvienošanas vaicājumos, izmantojot UNION ALL, lai uzzinātu, kā novērst šo scenāriju, izmantojot UNION ALL.
Kopsummu pievienošana apvienošanas vaicājumā
Apvienošanas vaicājumam īpašs pielietojums ir ierakstu kopas kombinēšana ar vienu ierakstu, kurā ir viena vai vairāku lauku summa.
Lūk, cits piemērs, kuru varat izveidot Northwind datu bāzes paraugā, lai parādītu, kā apvienošanas vaicājumā iegūt kopsummu.
Izveidojiet jaunu vienkāršu vaicājumu, lai skatītu alus iegādi (Northwind datu bāzē Produkta ID=34), izmantojot šādu SQL sintaksi:
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];Pārslēdzieties uz datu lapas skatu, un jābūt redzamiem četriem pirkumiem:
Saņemšanas datums Daudzums 22.01.2006. 100 22.01.2006. 60 04.04.2006. 50 05.04.2006. 300 Lai iegūtu kopsummu, izveidojiet vienkāršu apkopošanas vaicājumu, izmantojot šādu SQL kodu:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))Pārslēdzieties uz datu lapas skatu, un jābūt redzamam tikai vienam ierakstam:
Maksimālais saņemšanas datums Daudzumu summa 05.04.2006. 510 Kombinējiet šos divus vaicājumus apvienošanas vaicājumā, lai pievienotu ierakstu ar iegādes ierakstu kopsummu:
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];Pārslēdzieties uz datu lapas skatu, un jābūt redzamiem četriem pirkumiem ar katram atbilstošo summu, kam seko ieraksts ar daudzuma kopsummu:
Saņemšanas datums Daudzums 22.01.2006. 60 22.01.2006. 100 04.04.2006. 50 05.04.2006. 300 05.04.2006. 510
Šī bija pamatinformācija par kopsummu pievienošanu apvienošanas vaicājumam. Iespējams, vēlēsities abos vaicājumos iekļaut arī fiksētas vērtības, piemēram, "Detalizēti" un "Kopsumma", lai kopsummas ierakstu vizuāli nodalītu no citiem ierakstiem. Fiksētu vērtību izmantošanu varat pārskatīt sadaļā Trīs un vairāk tabulu vai vaicājumu kombinēšana apvienošanas vaicājumā.
Darbs ar atšķirīgiem ierakstiem apvienošanas vaicājumos, izmantojot UNION ALL
Programmā Access apvienošanas vaicājumi pēc noklusējuma ietver tikai atšķirīgus ierakstus. Kā rīkoties, ja vēlaties iekļaut visus ierakstus? Šeit varētu noderēt vēl viens piemērs.
Iepriekšējā sadaļā parādījām, kā apvienošanas vaicājumā izveidot kopsummu. Modificējiet šo apvienošanas vaicājumu SQL , lai iekļautu 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];
Pārslēdzieties uz datu lapas skatu, un jābūt redzamam tādam kā maldinošam rezultātam:
| Saņemšanas datums | Daudzums |
|---|---|
| 22.01.2006. | 100 |
| 22.01.2006. | 200 |
Protams, viens ieraksts neatgriež divreiz lielāku kopējo daudzumu.
Šāds rezultāts tiek rādīts, jo vienā dienā tas pats šokolādes daudzums tika pārdots divreiz, kā reģistrēts tabulā Detalizēta informācija par pirkšanas pasūtījumu. Lūk, vienkārša atlases vaicājuma rezultāts, kurā ir redzami abi ieraksti Northwind datu bāzes paraugā.
| Pirkšanas pasūtījuma ID | Produkts | Daudzums |
|---|---|---|
| 100 | Northwind Traders šokolāde | 100 |
| 92 | Northwind Traders šokolāde | 100 |
Iepriekš minētajā apvienošanas vaicājumā varat redzēt, ka lauks Pirkšanas pasūtījuma ID nav iekļauts, tāpēc šie divi lauki neveido divus atšķirīgus ierakstus.
Ja vēlaties iekļaut visus ierakstus, izmantojiet UNION ALLUNION nevis savā SQL. Tas, visticamāk, ietekmēs rezultātu kārtošanu, tāpēc, iespējams, vēlēsities iekļaut arī klauzulu ORDER BY , lai noteiktu kārtošanas secību. Lūk, modificēts SQL , pamatojoties uz iepriekšējo piemēru:
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];
Pārslēdzieties uz datu lapas skatu, un kopā ar kopsummu pēdējā ierakstā ir jābūt redzamai arī visai detalizētajai informācijai:
| Saņemšanas datums | Kopā | Daudzums |
|---|---|---|
| 22.01.2006. | 100 | |
| 22.01.2006. | 100 | |
| 22.01.2006. | Kopā | 200 |
Apvienošanas vaicājuma lietošana ierakstu filtrēšanai formā, izmantojot kombinētā lodziņa vadīklu
Apvienošanas vaicājums bieži vien tiek izmantots, lai kalpotu kā ierakstu avots formā iekļautai kombinētā lodziņa vadīklai. Šo kombinēto lodziņu varat izmantot, lai atlasītu vērtību formas ierakstu filtrēšanai. Piemēram, lai filtrētu darbinieku ierakstus pēc pilsētas.
Lai noskaidrotu, kā tas varētu darboties, lūk, cits piemērs, kuru varat izveidot Northwind datu bāzes paraugā, lai ilustrētu šo scenāriju.
Izveidojiet vienkāršu atlases vaicājumu, izmantojot šo
SQLsintaksi:SELECT Employees.City, Employees.City AS Filter FROM Employees;Pārslēdzieties uz datu lapas skatu, un jābūt redzamiem šādiem rezultātiem:
Pilsēta Filtrs Jūrmala Jūrmala Sloka Sloka Sigulda Sigulda Olaine Olaine Jūrmala Jūrmala Sigulda Sigulda Jūrmala Jūrmala Sigulda Sigulda Jūrmala Jūrmala Skatot šos rezultātus, iespējams, nesaskatīsit neko vērtīgu. Tomēr izvērsiet vaicājumu un pārvērtiet to par apvienošanas vaicājumu, izmantojot šādas
SQLiespējas:SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;Pārslēdzieties uz datu lapas skatu, un jābūt redzamiem šādiem rezultātiem:
Pilsēta Filtrs <Visi> * Sloka Sloka Olaine Olaine Sigulda Sigulda Jūrmala Jūrmala Programma Access veic šo deviņu ierakstu apvienošanu, kas iepriekš parādīti, ar fiksētām lauku vērtībām <All> un "*". Tā kā šajā apvienošanas klauzulā nav ,
UNION ALLAccess atgriež tikai atšķirīgus ierakstus. Tas nozīmē, ka katra pilsēta tiek atgriezta tikai vienu reizi ar fiksētām identiskām vērtībām.Tagad, kad jums ir pabeigts apvienošanas vaicājums, kas katru pilsētas nosaukumu rāda tikai vienu reizi, kopā ar opciju, kas efektīvi atlasa visas pilsētas, šo vaicājumu varat izmantot kā ierakstu avotu formas kombinētajam lodziņam. Izmantojot šo konkrēto piemēru kā modeli, formā varat izveidot kombinēto lodziņu, iestatīt šo vaicājumu kā tā ierakstu avotu, kolonnas Filtrs rekvizītam Kolonnas platums iestatīt vērtību 0 (nulle), lai vizuāli to paslēptu, un pēc tam iestatīt rekvizīta Saistītā kolonna vērtību 1, lai norādītu otrās kolonnas indeksu. Pēc
Filtertam pašas formas rekvizītā varat pievienot kodu, līdzīgi kā redzams, lai aktivizētu formas filtru, izmantojot vērtību, kas atlasīta kombinētā lodziņa vadīklā:Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = TruePēc tam veidlapas lietotājs var filtrēt veidlapas ierakstus pēc konkrēta pilsētas nosaukuma vai atlasīt <Visi> , lai uzskaitītu visus ierakstus visām pilsētām.