Kartais gali reikėti išdėstyti įrašus iš vienos lentelės ar užklausos kartu su įrašais iš vienos ar daugiau lentelių, norint sukurti vieną įrašų rinkinį – visų įrašų iš dviejų ar daugiau lentelių sąrašą. Tai yra „union“ užklausos programoje „Access“ paskirtis.
Norėdami efektyviai suprasti "union" užklausas, pirmiausia turite būti susipažinę su pagrindinių išrinkimo užklausų kūrimą programoje "Access". Norėdami sužinoti daugiau apie išrinkimo užklausų kūrimą, žr . Paprastos išrinkimo užklausos kūrimas.
Veikiančios „union“ užklausos pavyzdžio analizė
Jei anksčiau nesate sukūrę „union“ užklausos, gali būti naudinga pirmiausia paanalizuoti veikiantį pavyzdį, kuris yra „Access“ šablone „Northwind“. Galite ieškoti „Northwind“ šablono pavyzdžio „Access“ darbo pradžios puslapyje spustelėdami Failas > Naujas arba tiesiogiai atsisiųsti kopiją iš šios vietos: „Northwind“ šablono pavyzdys.
Kai „Access“ atidarys „Northwind“ duomenų bazę, išjunkite pasirodžiusį prisijungimo dialogo langą, tada išplėskite naršymo sritį. Spustelėkite naršymo srities viršuje ir pasirinkite Objekto tipas, kad tvarkytumėte visus duomenų bazės objektus pagal jų tipą. Tada išplėskite grupę Užklausos ir pamatysite užklausą pavadinimu Produkto operacijos.
„Union“ užklausas paprasta atskirti nuo kitų užklausos objektų, nes jos turi specialią piktogramą, panašią į du susikabinusius apskritimus, kuri simbolizuoja iš dviejų rinkinių sudarytą jungtinį rinkinį.
Skirtingai nei įprastos pasirinkimo ir veiksmų užklausos, "union" užklausoje lentelės nėra susijusios, o tai reiškia, kad "Access" grafinių užklausų dizaino įrankio negalima naudoti "union" užklausoms kurti arba redaguoti. Taip nutiks, jei "union" užklausą atidarysite naršymo srityje; "Access" atidaro ją ir pateikia rezultatus duomenų lapo rodinyje. Skirtuke Pagrindinis esančioje komandoje Rodiniai pastebėsite, kad dizaino rodinys negalimas, kai dirbate su "union" užklausomis. Duomenų lapo rodinį ir SQL rodinį galite perjungti tik dirbdami su "union" užklausomis.
Norėdami toliau analizuoti šį „union“ užklausos pavyzdį, spustelėkite Pagrindinis > Rodiniai > SQL rodinys, kad peržiūrėtumėte užklausą apibrėžiančią SQL sintaksę. Šiame pavyzdyje į SQL įtraukėme papildomų tarpų, kad galėtumėte lengvai matyti skirtingas dalis, kurios sudaro „union“ užklausą.
Išsamiau paanalizuokime šios „Northwind“ duomenų bazės „union“ užklausos SQL sintaksę.
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;
Pirma ir trečia šio SQL sakinio dalys iš esmės yra dvi išrinkimo užklausos. Šios užklausos gauna du skirtingus įrašų rinkinius: vieną iš lentelės Produkto užsakymai, o kitą iš lentelės Produkto pirkimai.
Antra šio SQL sakinio dalis yra raktinis žodis UNION, kuris programai „Access“ nurodo, kad ši užklausa sujungs šiuos du įrašų rinkinius.
Paskutinė šio SQL sakinio dalis nustato sujungtų įrašų rikiavimo tvarką naudojant sakinį ORDER BY. Šiame pavyzdyje „Access“ rikiuos visus įrašus mažėjančia tvarka pagal lauką Užsakymo data.
Pastaba: „Union“ užklausos programoje „Access“ visada yra tik skaitomos.
„Union“ užklausos kūrimas sukuriant ir sujungiant išrinkimo užklausas
Nors galite sukurti „union“ užklausą tiesiogiai parašydami SQL sintaksę SQL rodinyje, gali būti lengviau ją sukurti dalimis naudojant išrinkimo užklausas. Tada galite nukopijuoti ir įklijuoti SQL dalis į sujungtą „union“ užklausą.
Jei užuot skaitę veiksmus norite peržiūrėti pavyzdį, žr. tolesnį skyrių Peržiūrėkite „union“ užklausos kūrimo pavyzdį.
-
Skirtuko Kūrimas grupėje Užklausos spustelėkite Užklausos dizainas.
-
Dukart spustelėkite lentelę, kurioje yra norimi įtraukti laukai. Lentelė įtraukiama į užklausos dizaino langą.
-
Užklausos dizaino lange dukart spustelėkite norimus įtraukti laukus. Rinkdamiesi laukus įsitikinkite, kad įtraukiate tiek pat laukų ir jie išdėstyti toki pačia tvarka, kuria juos įtraukiate į kitas išrinkimo užklausas. Atkreipkite dėmesį į laukų duomenų tipus ir įsitikinkite, kad jų duomenų tipai suderinami su laukų, esančių toje pačioje vietoje kitose užklausose, kurias sujungiate, duomenų tipais. Pavyzdžiui, jei pirmojoje išrinkimo užklausoje yra penki laukai, iš kurių pirmajame yra datos / laiko duomenys, įsitikinkite, kad visos kitos jungiamos išrinkimo užklausos taip pat turi penkis laukus, iš kurių pirmajame yra datos / laikos duomenys ir t. t.
-
Jei norite, į laukus galite įtraukti kriterijų, įvesdami atitinkamus reiškinius laukų tinklelio eilutėje Kriterijai.
-
Užbaigę laukų ir laukų kriterijų įtraukimą paleiskite išrinkimo užklausą ir peržiūrėkite jos išvestį. Skirtuko Dizainas grupėje Rezultatai spustelėkite Vykdyti.
-
Perjunkite užklausos rodinį į dizaino rodinį.
-
Įrašykite išrinkimo užklausą ir palikite ją atidarytą.
-
Šią procedūrą pakartokite su kiekviena išrinkimo užklausa, kurią norite sujungti.
Sukūrus išrinkimo užklausas, metas jas sujungti. Atliekant šį veiksmą, sukuriama „union“ užklausa nukopijuojant ir įklijuojant SQL sakinius.
-
Skirtuko Kūrimas grupėje Užklausos spustelėkite Užklausos dizainas.
-
Skirtuko Dizainas grupėje Užklausa spustelėkite „Union“. „Access“ paslepia užklausų dizaino langą ir rodo SQL rodinio objektų skirtuką. Šiuo metu SQL rodinio objekto skirtukas yra tuščias.
-
Spustelėkite pirmos išrinkimo užklausos, kurią norite sujungti į „union“ užklausą, skirtuką.
-
Skirtuke Pagrindinis spustelėkite Rodinys> SQL rodinys.
-
Nukopijuokite atrankos užklausos SQL sakinį. Spustelėkite anksčiau pradėtos kurti „union“ užklausos skirtuką.
-
Įklijuokite išrinkimo užklausos SQL sakinį į „union“ užklausos SQL rodinio objektų skirtuko lapą.
-
Panaikinkite kabliataškį (;) atrankos užklausos SQL sakinio gale.
-
Paspauskite klavišą Enter, kad perkeltumėte žymiklį viena eilute žemyn, tada naujoje eilutėje įveskite UNION.
-
Spustelėkite kitos išrinkimo užklausos, kurią norite sujungti į „union“ užklausą, skirtuką.
-
Kartokite 5–10 šios procedūros veiksmus, kol nukopijuosite ir įklijuosite visus atrankos užklausų SQL sakinius į sąjungos užklausos SQL rodinio langą. Po paskutinės atrankos užklausos nepanaikinkite kabliataškio ir po SQL sakinio nieko neįveskite.
-
Skirtuko Dizainas grupėje Rezultatai spustelėkite Vykdyti.
„Union“ užklausos rezultatai rodomi duomenų lapo rodinyje.
Peržiūrėkite „union“ užklausos kūrimo pavyzdį
Štai pavyzdys, kurį galite atkurti „Northwind“ duomenų bazės pavyzdyje. „Union“ užklausa surenka žmonių, nurodytų lentelėje Klientai vardus ir sujungia juos su žmonėmis, esančiais lentelėje Tiekėjai. Jei norite sekti, atlikite toliau pateiktus veiksmus savo „Northwind“ duomenų bazės pavyzdžio kopijoje.
Štai veiksmai norint sukurti šiame pavyzdyje pateiktą užklausą:
-
Sukurkite dvi išrinkimo užklausas, pavadintas 1užklausa ir 2užklausa, kurių duomenų šaltiniai yra atitinkamai lentelės Klientai ir Tiekėjai. Kaip rodomas reikšmes pasirinkite laukus Vardas ir Pavardė.
-
Sukurkite naują užklausą pavadinimu 3užklausa, kuri iš pradžių neturės duomenų šaltinio, tada spustelėkite skirtuke Dizainas esančią komandą „Union“.
-
Nukopijuokite ir įklijuokite SQL sakinius iš 1užklausa ir 2užklausa į 3užklausa. Būtinai pašalinkite papildomą kabliataškį ir įtraukite raktažodį UNION. Tada rezultatus galite patikrinti duomenų lapo rodinyje.
-
Į vieną iš užklausų įtraukite rikiavimo sąlygą, tada įklijuokite sakinį ORDER BY „union“ užklausos SQL rodinyje. Atkreipkite dėmesį, kad „union“ užklausos 3užklausoje, kai rikiavimo tvarka bus netrukus pridedama, pirmiausia pašalinami kabliataškiai, tada lentelės pavadinimas iš laukų pavadinimų.
-
Galutinis šio „union“ užklausos pavyzdžio SQL, kuris sujungia ir surikiuoja vardus, yra toks:
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];
Jei gerai mokate rašyti SQL sintaksę, galite parašyti savo „union“ užklausos SQL sakinį tiesiogiai SQL rodinyje. Tačiau gali būti naudinga laikytis metodo, kai SQL nukopijuojamas ir įklijuojamas iš kitų užklausos objektų. Kiekviena užklausa gali būti daug sudėtingesnė nei čia naudojami paprasti išrinkimo užklausų pavyzdžiai. Gali būti naudinga sukurti ir atidžiai išbandyti kiekvieną užklausą prieš jas sujungiant „union“ užklausoje. Jei „union“ užklausos nepavyksta paleisti, galite koreguoti kiekvieną užklausą atskirai, kol ją paleisti pavyksta, tada iš naujo sukurti „union“ užklausą su pataisyta sintakse.
Peržiūrėkite likusius šio straipsnio skyrius, kad sužinotumėte daugiau patarimų ir gudrybių naudojant „union“ užklausas.
Ankstesniame skyriuje pateiktame pavyzdyje naudojant „Northwind“ duomenų bazę duomenys sujungiami tik iš dviejų lentelių. Tačiau „union“ užklausoje labai lengvai galite sujungti tris ar daugiau lentelių. Pavyzdžiui, tęsiant ankstesnį pavyzdį, į užklausos išvestį taip pat galite įtraukti darbuotojų vardus. Tai galite padaryti įtraukdami trečią užklausą ir ją sujungdami su ankstesniu SQL sakiniu naudodami papildomą raktažodį UNION, kaip parodyta čia:
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];
Peržiūrint rezultatą duomenų lapo rodinyje, visi darbuotojai bus pateikti su tuo pačiu įmonės pavadinimu, o tai tikriausiai nėra labai naudinga. Jei norite, kad lauke būtų nurodoma, ar asmuo yra vietinis darbuotojas, tiekėjo darbuotojas ar kliento darbuotojas, vietoj įmonės pavadinimo galite įtraukti fiksuotą reikšmę. Štai kaip atrodytų 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];
Štai kaip rezultatas rodomas duomenų lapo rodinyje. „Access“ rodo šiuos penkis įrašų pavyzdžius.
Darbas |
Pavardė |
Vardas |
Vidinis |
Gabrienė |
Teresė |
Vidinis |
Bočkutė |
Laura |
Tiekėjas |
Einavičius |
Rimantas |
Klientas |
Dapkus |
Darius |
Klientas |
Šukys |
Vygaudas |
Pirmiau pateiktą užklausą galima sumažinti dar labiau, kadangi „Access“ skaito tik pirmos užklausos „union“ užklausoje išvesties laukų vardus. Čia matote, jog pašalinome išvestį iš antros ir trečios užklausų sekcijų:
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“ „union“ užklausoje rikiavimas leidžiamas tik vieną kartą, bet kiekvieną užklausą galima filtruoti atskirai. Remiantis ankstesniame skyriuje pateikta „union“ užklausa, štai pavyzdys, kaip mes filtravome kiekvieną užklausą įtraukdami sąlygą 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];
Įjunkite duomenų lapo rodinį ir pamatysite rezultatus, panašius į šiuos:
Darbas |
Pavardė |
Vardas |
Tiekėjas |
Stankevičiūtė |
Miglė |
Vidinis |
Gabrienė |
Teresė |
Klientas |
Adomaitis |
Jonas |
Vidinis |
Grigaitė |
Audra |
Tiekėjas |
Eiraitė |
Sandra |
Klientas |
Mažeika |
Jurgis |
Tiekėjas |
Mickus |
Mikas |
Tiekėjas |
Sunsaitė |
Lina |
Vidinis |
Vainius |
Tomas |
Tiekėjas |
Galinienė |
Kornelija |
Vidinis |
Balčiūnas |
Rimantas |
Jei „union“ užklausos labai skiriasi, galite susidurti su situacija, kai išvesties laukas turi sujungti skirtingų tipų duomenis. Jei taip nutinka, „union“ užklausa dažniausiai grąžins teksto duomenų tipo rezultatus, kadangi šis duomenų tipas gali apimti ir tekstą, ir skaičius.
Kad suprastumėte, kaip tai veikia, naudosime „union“ užklausą Produkto operacijos „Northwind“ duomenų bazės pavyzdyje. Atidarykite tą duomenų bazės pavyzdį, tada atidarykite užklausą Produkto operacijos duomenų lapo rodinyje. Paskutinieji dešimt įrašų turėtų būti panašūs į šią išvestį:
Produkto ID |
Užsakymo data |
Įmonės pavadinimas |
Operacija |
Kiekis |
77 |
2006-01-22 |
Tiekėjas B |
Pirkimas |
60 |
80 |
2006-01-22 |
Tiekėjas D |
Pirkimas |
75 |
81 |
2006-01-22 |
Tiekėjas A |
Pirkimas |
125 |
81 |
2006-01-22 |
Tiekėjas A |
Pirkimas |
200 |
7 |
2006-01-20 |
D įmonė |
Pardavimas |
10 |
51 |
2006-01-20 |
D įmonė |
Pardavimas |
10 |
80 |
2006-01-20 |
D įmonė |
Pardavimas |
10 |
34 |
2006-01-15 |
AA įmonė |
Pardavimas |
100 |
80 |
2006-01-15 |
AA įmonė |
Pardavimas |
30 |
Tarkime, kad norite išskaidyti lauką Kiekis į dvi dalis – pirkimas ir pardavimas. Taip pat laukuose, kuriuose nėra reikšmės, norite turėti fiksuotą nulinę reikšmę. Štai kaip atrodys šios „union“ užklausos 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;
Įjungus duomenų lapo rodinį, paskutinieji dešimt įrašų atrodys taip:
Produkto ID |
Užsakymo data |
Įmonės pavadinimas |
Operacija |
Pirkimas |
Pardavimas |
74 |
2006-01-22 |
Tiekėjas B |
Pirkimas |
20 |
0 |
77 |
2006-01-22 |
Tiekėjas B |
Pirkimas |
60 |
0 |
80 |
2006-01-22 |
Tiekėjas D |
Pirkimas |
75 |
0 |
81 |
2006-01-22 |
Tiekėjas A |
Pirkimas |
125 |
0 |
81 |
2006-01-22 |
Tiekėjas A |
Pirkimas |
200 |
0 |
7 |
2006-01-20 |
D įmonė |
Pardavimas |
0 |
10 |
51 |
2006-01-20 |
D įmonė |
Pardavimas |
0 |
10 |
80 |
2006-01-20 |
D įmonė |
Pardavimas |
0 |
10 |
34 |
2006-01-15 |
AA įmonė |
Pardavimas |
0 |
100 |
80 |
2006-01-15 |
AA įmonė |
Pardavimas |
0 |
30 |
Tęsiant šį pavyzdį, ką daryti, jei norite, kad laukai, kuriuose yra nulinės reikšmės, būtų tušti? Galite modifikuoti SQL, kad užuot rodžius nulį būtų nerodoma nieko, įtraukdami raktažodį Null, kaip parodyta čia:
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;
Tačiau, kaip galbūt pastebėjote įjungę duomenų lapo rodinį, dabar turite netikėtą rezultatą. Stulpelyje Pirkimas visi laukai išvalyti:
Produkto ID |
Užsakymo data |
Įmonės pavadinimas |
Operacija |
Pirkimas |
Pardavimas |
74 |
2006-01-22 |
Tiekėjas B |
Pirkimas |
||
77 |
2006-01-22 |
Tiekėjas B |
Pirkimas |
||
80 |
2006-01-22 |
Tiekėjas D |
Pirkimas |
||
81 |
2006-01-22 |
Tiekėjas A |
Pirkimas |
||
81 |
2006-01-22 |
Tiekėjas A |
Pirkimas |
||
7 |
2006-01-20 |
D įmonė |
Pardavimas |
10 |
|
51 |
2006-01-20 |
D įmonė |
Pardavimas |
10 |
|
80 |
2006-01-20 |
D įmonė |
Pardavimas |
10 |
|
34 |
2006-01-15 |
AA įmonė |
Pardavimas |
100 |
|
80 |
2006-01-15 |
AA įmonė |
Pardavimas |
30 |
Taip atsitinka todėl, kad „Access“ nustato laukų duomenų tipus pagal pirmą užklausą. Šiame pavyzdyje Null (tuščia reikšmė) nėra skaičius.
Taigi kas nutiks, jei pabandysite įterpti tuščią eilutę į laukų tuščią reikšmę? Šio bandymo SQL rezultatas gali atrodyti taip:
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;
Įjungę duomenų lapo rodinį, pamatysite, kad „Access“ gauna Pirkimo reikšmes, bet jas konvertavo į tekstą. Galite nustatyti, kad tai tekstinės reikšmės, nes duomenų lapo rodinyje jos lygiuojamos kairėje. Tuščia eilutė pirmoje užklausoje nėra skaičius, todėl ir matote tokius rezultatus. Taip pat pastebėsite, kad Pardavimo reikšmės irgi konvertuotos į tekstą, nes pirkimo įrašuose yra tuščia eilutė.
Produkto ID |
Užsakymo data |
Įmonės pavadinimas |
Operacija |
Pirkimas |
Pardavimas |
74 |
2006-01-22 |
Tiekėjas B |
Pirkimas |
20 |
|
77 |
2006-01-22 |
Tiekėjas B |
Pirkimas |
60 |
|
80 |
2006-01-22 |
Tiekėjas D |
Pirkimas |
75 |
|
81 |
2006-01-22 |
Tiekėjas A |
Pirkimas |
125 |
|
81 |
2006-01-22 |
Tiekėjas A |
Pirkimas |
200 |
|
7 |
2006-01-20 |
D įmonė |
Pardavimas |
10 |
|
51 |
2006-01-20 |
D įmonė |
Pardavimas |
10 |
|
80 |
2006-01-20 |
D įmonė |
Pardavimas |
10 |
|
34 |
2006-01-15 |
AA įmonė |
Pardavimas |
100 |
|
80 |
2006-01-15 |
AA įmonė |
Pardavimas |
30 |
Kaip išspręsti šią problemą?
Vienas iš sprendimų yra priversti užklausą tikėtis, kad lauko reikšmė bus skaičius. Tai galima atlikti naudojant reiškinį:
IIf(False, 0, Null)
Tikrintina sąlyga, False (klaidinga), niekada nebus True (teisinga), todėl reiškinys visada grąžins Null (tuščią reikšmę), bet „Access“ vis tiek įvertina abi išvesties parinktis ir nusprendžia, ar išvestis bus skaitinė, ar Null.
Štai kaip galime naudoti šį reiškinį mūsų pavyzdyje:
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;
Atkreipkite dėmesį, kad antrosios užklausos modifikuoti nereikia.
Jei įjungsite duomenų lapo rodinį, matysite rezultatą, kurio mums reikia:
Produkto ID |
Užsakymo data |
Įmonės pavadinimas |
Operacija |
Pirkimas |
Pardavimas |
74 |
2006-01-22 |
Tiekėjas B |
Pirkimas |
20 |
|
77 |
2006-01-22 |
Tiekėjas B |
Pirkimas |
60 |
|
80 |
2006-01-22 |
Tiekėjas D |
Pirkimas |
75 |
|
81 |
2006-01-22 |
Tiekėjas A |
Pirkimas |
125 |
|
81 |
2006-01-22 |
Tiekėjas A |
Pirkimas |
200 |
|
7 |
2006-01-20 |
D įmonė |
Pardavimas |
10 |
|
51 |
2006-01-20 |
D įmonė |
Pardavimas |
10 |
|
80 |
2006-01-20 |
D įmonė |
Pardavimas |
10 |
|
34 |
2006-01-15 |
AA įmonė |
Pardavimas |
100 |
|
80 |
2006-01-15 |
AA įmonė |
Pardavimas |
30 |
Kitas būdas pasiekti tą patį rezultatą yra prieš užklausas, esančias „union“ užklausoje, pridėti dar vieną užklausą:
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
Kiekviename lauke „Access“ grąžina jūsų nustatyto duomenų tipo fiksuotas reikšmes. Žinoma, turbūt nenorite, kad šios užklausos išvestis kliudytų rezultatams, todėl norėdami to išvengti įtraukite sąlygą WHERE, kurios reikšmė yra False:
WHERE False
Tai nedidelė gudrybė, nes rezultatas visada yra False ir užklausa nieko negrąžina. Sujungę šį sakinį su esamu SQL, gauname užbaigtą sakinį:
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;
Pastaba: Šiame pavyzdyje naudojant „Northwind“ duomenų bazę sujungta užklausa grąžina 100 įrašų, o dvi atskiros užklausos grąžina 58 ir 43 įrašus, iš viso 101 įrašai. Šio neatitikimo priežastis yra ta, kad du įrašai nėra unikalūs. Norėdami sužinoti, kaip išspręsti šį scenarijų naudojant UNION ALL, žr. skyrių Darbas su unikaliais įrašais „union“ užklausose naudojant UNION ALL.
Specialus „union“ užklausos naudojimo atvejis yra sujungti įrašų rinkinį su vienu įrašu, kuriame yra vieno arba daugiau laukų suma.
Štai kitas pavyzdys, kurį galite sukurti „Northwind“ duomenų bazės pavyzdyje, kad suprastumėte, kaip gauti sumą „union“ užklausoje.
-
Sukurkite naują paprastą užklausą, kad peržiūrėtumėte alaus (produkto ID „Northwind“ duomenų bazėje yra 34) pirkimus naudodami šią SQL sintaksę:
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];
-
Įjunkite duomenų lapo rodinį ir turėtumėte matyti keturis pirkimus:
Gavimo data
Kiekis
2006-01-22
100
2006-01-22
60
2006-04-04
50
2006-04-05
300
-
Norėdami gauti sumą, sukurkite paprastą agregavimo užklausą naudodami šį SQL:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))
-
Įjunkite duomenų lapo rodinį ir turėtumėte tik vieną įrašą:
Gavimo datos didžiausia reikšmė
Kiekių suma
2006-04-05
510
-
Sujunkite šias dvi užklausas į „union“ užklausą, kad prie pirkimo įrašų pridėtumėte bendro kiekio įrašą:
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];
-
Įjunkite duomenų lapo rodinį ir turėtumėte matyti keturis pirkimus ir jų sumą, o po jų – įrašą, kuris susumuoja kiekius.
Gavimo data
Kiekis
2006-01-22
60
2006-01-22
100
2006-04-04
50
2006-04-05
300
2006-04-05
510
Tai visi sumų įtraukimo į „union“ užklausą pagrindai. Taip pat galite įtraukti fiksuotas reikšmes abiejose užklausose, pvz., „išsami informacija“ ir „suma“, kad vizualiai atskirtumėte sumos įrašą nuo kitų įrašų. Galite apžvelgti fiksuotų reikšmių naudojimą skyriuje Trijų arba daugiau lentelių sujungimas „union“ užklausoje.
Programoje „Access“ „Union“ užklausose pagal numatytuosius parametrus yra tik unikalūs įrašai. Tačiau ką daryti, jei norite įtraukti visus įrašus? Čia gali praversti kitas pavyzdys.
Ankstesniame skyriuje parodėme jums, kaip „union“ užklausoje sukurti sumą. Modifikuokite tą „union“ užklausos SQL įtraukdami 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];
Įjungę duomenų lapo rodinį turėtumėte matyti šiek tiek klaidinantį rezultatą:
Gavimo data |
Kiekis |
2006-01-22 |
100 |
2006-01-22 |
200 |
Žinoma, vienas įrašas negrąžina dvigubo kiekio sumos.
Šio rezultato priežastis yra ta, kad vieną dieną toks pats šokolado kiekis buvo parduotas du kartus – tai įrašyta lentelėje Pirkimo užsakymo informacija. Štai paprasta išrinkimo užklausa, parodanti abu įrašus „Northwind“ duomenų bazės pavyzdyje:
Pirkimo užsakymo ID |
Produktas |
Kiekis |
100 |
„Northwind Traders“ šokoladas |
100 |
92 |
„Northwind Traders“ šokoladas |
100 |
Pirmiau paminėtoje „union“ užklausoje galite matyti, kad laukas Pirkimo užsakymo ID nėra įtrauktas, o abu laukai nesudaro dviejų unikalių įrašų.
Jei norite įtraukti visus įrašus, SQL sakinyje naudokite UNION ALL, o ne UNION. Tai tikriausiai turės įtakos rezultatų rikiavimui, todėl taip pat galite įtraukti sąlygą ORDER BY, kad nustatytumėte rikiavimo tvarką. Štai modifikuotas SQL, paremtas ankstesniu pavyzdžiu:
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];
Įjungę duomenų lapo rodinį turėtumėte matyti visą informaciją bei sumą kaip paskutinį įrašą.
Gavimo data |
Suma |
Kiekis |
2006-01-22 |
100 |
|
2006-01-22 |
100 |
|
2006-01-22 |
Suma |
200 |
„Union“ užklausos yra dažnai naudojamos kaip formos pasirinktinio įvedimo lauko valdiklio įrašų šaltinis. Galite naudoti tą pasirinktinio įvedimo lauką, kad pasirinktumėte reikšmę ir filtruotumėte formos įrašus. Pavyzdžiui, galite filtruoti darbuotojų įrašus pagal jų miestą.
Kad suprastumėte, kaip tai veikia, pateikiame kitą pavyzdį, kurį galite sukurti „Northwind“ duomenų bazės pavyzdyje, paaiškinantį šį scenarijų.
-
Sukurkite paprastą išrinkimo užklausą naudodami šią SQL sintaksę:
SELECT Employees.City, Employees.City AS Filter FROM Employees;
-
Įjunkite duomenų lapo rodinį ir turėtumėte matyti šiuos rezultatus:
Miestas
Filtras
Šiauliai
Šiauliai
Rokiškis
Rokiškis
Raseiniai
Raseiniai
Kaunas
Kaunas
Šiauliai
Šiauliai
Raseiniai
Raseiniai
Šiauliai
Šiauliai
Raseiniai
Raseiniai
Šiauliai
Šiauliai
-
Žvelgiant į šiuos rezultatus, neatrodo, kad jie naudingi. Išplėskite užklausą ir pertvarkykite ją į „union“ užklausą naudodami šį SQL:
SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;
-
Įjunkite duomenų lapo rodinį ir turėtumėte matyti šiuos rezultatus:
Miestas
Filtras
<All>
*
Rokiškis
Rokiškis
Kaunas
Kaunas
Raseiniai
Raseiniai
Šiauliai
Šiauliai
„Access“ sukuria „union“ užklausą iš anksčiau pateiktų devynių įrašų, kurių fiksuotos reikšmės yra <All> (visi) ir „*“.
Kadangi šioje „union“ sąlygoje nėra UNION ALL, „Access“ grąžina tik unikalius įrašus, o tai reiškia, kad kiekvienas miestas grąžinamas tik vieną kartą su fiksuotomis identiškomis reikšmėmis.
-
Dabar, kai turite užbaigtą „union“ užklausą, rodančią kiekvieno miesto pavadinimą tik vieną kartą, kartu su parinktimis, kuri iš esmės parenka visus miestus, galite naudoti šią užklausą kaip formos pasirinktinio įvedimo lauko įrašų šaltinį. Naudodami šį konkretų pavyzdį kaip modelį, galite sukurti formos pasirinktinio įvedimo lauko valdiklį, nustatyti šią užklausą kaip jos įrašų šaltinį, nustatyti stulpelio Filtras ypatybę Column Width (stulpelio plotis) kaip 0 (nulis), kad jis būtų paslėptas, ir nustatyti ypatybę Bound Column (susietas stulpelis) kaip 1, kad nurodytumėte antro stulpelio indeksą. Pačios formos ypatybėje Filter (filtras) galite įtraukti kodą, tokį kaip nurodytas toliau, kad suaktyvintumėte formos filtrą naudodami to, kas buvo pasirinkta pasirinktinio įvedimo lauko valdiklyje, reikšmę.
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
Tada formos naudotojas gali filtruoti formos įrašus pagal konkretų miesto pavadinimą arba pasirinkti <All>, kad būtų pateikiami visų miestų įrašai.