„Union“ užklausos naudojimas norint sujungti kelių užklausų rezultatus į vieną

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į.

„Union“ užklausos programoje „Access“ ekrano kopija

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ą.

Jūsų naršyklė nepalaiko vaizdo įrašo. Įdiekite „Microsoft Silverlight“, „Adobe Flash Player“ ar „Internet Explorer 9“.

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į.

  1. Skirtuko Kūrimas grupėje Užklausos spustelėkite Užklausos dizainas.

  2. Dukart spustelėkite lentelę, kurioje yra norimi įtraukti laukai. Lentelė įtraukiama į užklausos dizaino langą.

  3. 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.

  4. Jei norite, į laukus galite įtraukti kriterijų, įvesdami atitinkamus reiškinius laukų tinklelio eilutėje Kriterijai.

  5. 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.

  6. Perjunkite užklausos rodinį į dizaino rodinį.

  7. Įrašykite išrinkimo užklausą ir palikite ją atidarytą.

  8. Š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.

  1. Skirtuko Kūrimas grupėje Užklausos spustelėkite Užklausos dizainas.

  2. 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.

  3. Spustelėkite pirmos išrinkimo užklausos, kurią norite sujungti į „union“ užklausą, skirtuką.

  4. Skirtuke Pagrindinis spustelėkite Rodinys> SQL rodinys.

  5. Nukopijuokite atrankos užklausos SQL sakinį. Spustelėkite anksčiau pradėtos kurti „union“ užklausos skirtuką.

  6. Įklijuokite išrinkimo užklausos SQL sakinį į „union“ užklausos SQL rodinio objektų skirtuko lapą.

  7. Panaikinkite kabliataškį (;) atrankos užklausos SQL sakinio gale.

  8. Paspauskite klavišą Enter, kad perkeltumėte žymiklį viena eilute žemyn, tada naujoje eilutėje įveskite UNION.

  9. Spustelėkite kitos išrinkimo užklausos, kurią norite sujungti į „union“ užklausą, skirtuką.

  10. 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.

  11. 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.

Jūsų naršyklė nepalaiko vaizdo įrašo. Įdiekite „Microsoft Silverlight“, „Adobe Flash Player“ ar „Internet Explorer 9“.

Štai veiksmai norint sukurti šiame pavyzdyje pateiktą užklausą:

  1. 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ė.

  2. Sukurkite naują užklausą pavadinimu 3užklausa, kuri iš pradžių neturės duomenų šaltinio, tada spustelėkite skirtuke Dizainas esančią komandą „Union“.

  3. 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.

  4. Į 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ų.

  5. 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.

  1. 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];
  2. Į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

  3. 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))
  4. Įjunkite duomenų lapo rodinį ir turėtumėte tik vieną įrašą:

    Gavimo datos didžiausia reikšmė

    Kiekių suma

    2006-04-05

    510

  5. 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];
  6. Į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ų.

  1. Sukurkite paprastą išrinkimo užklausą naudodami šią SQL sintaksę:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
  2. Į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

  3. Ž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;
  4. Į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.

  5. 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.

Puslapio viršus

Reikia daugiau pagalbos?

Norite daugiau parinkčių?

Sužinokite apie prenumeratos pranašumus, peržiūrėkite mokymo kursus, sužinokite, kaip apsaugoti savo įrenginį ir kt.

Bendruomenės padeda užduoti klausimus ir į juos atsakyti, pateikti atsiliepimų ir išgirsti iš ekspertų, turinčių daug žinių.