Използване на заявка за обединение, за да се комбинират няколко заявки в една
Applies ToAccess за Microsoft 365 Access 2024 Access 2021 Access 2019 Access 2016

Понякога можете да направите списък на записи от една таблица или заявка с такива от една или повече други таблици, за да бъде съставен един набор от записи – списък с всички записи от две или повече таблици. Това е целта на заявка за обединение в Access.

За да разберете ефективно заявките за обединение, трябва първо да сте запознати с проектирането на основни заявки за избиране в Access. За да научите повече за проектирането на заявки за избиране, вижте Създаване на проста заявка за избиране.

Разглеждане на пример за работата на заявка за обединение

Ако никога преди това не сте създавали заявка за обединение, може да сметнете за полезно най-напред да се запознаете с пример за работата на такава заявка в шаблона Northwind на Access. Можете да потърсите примерния шаблон Northwind в страницата "Първи стъпки с Access", като щракнете върху Файл > Създай, а можете и директно да изтеглите копие от това местоположение: Примерен шаблон Northwind.

След като Access отвори базата данни Northwind, пропуснете формуляра в диалоговия прозорец за влизане, който се появява в началото, и след това разгънете навигационния екран. Щракнете в горния край на навигационния екран и след това изберете Тип на обекта, за да организирате всички обекти база данни по техния тип. След това разгънете групата Заявки, и ще видите заявка, наречена Транзакции на продукти.

Заявките за обединение лесно се различават от другите обекти заявка, тъй като имат специфична икона, наподобяваща две преплетени окръжности, представящи обединение на два набора:

Екранна снимка на икона на заявка за обединение в Access.

За разлика от нормалните заявки за избор и действие, таблиците не са свързани в заявка за обединение, което означава, че графичният конструктор на заявки в Access не може да бъде използван за създаване или редактиране на заявки за обединение. Ще видите това, ако отворите заявка за обединение от навигационния екран; Access го отваря и показва резултатите в изглед на лист с данни. Под Изгледи в раздела Начало ще забележите, че когато работите със заявки за обединение липсва Изглед за проектиране. Когато работите със заявки за обединение, може да превключвате само между Изглед на лист с данни и SQL изглед.

За да продължите с разглеждането на този пример за заявка за обединение, щракнете върху Начало > Изгледи > SQL изглед, за да видите SQL синтаксиса, който я дефинира. На тази илюстрация добавихме някои допълнителни интервали в SQL, за да можете лесно да различите отделните части, които съставят една заявка за обединение.

Вашият браузър не поддържа видео. Инсталирайте Microsoft Silverlight, Adobe Flash Player или Internet Explorer 9.

Нека подробно да разгледаме SQL синтаксиса на тази заявка за обединение от базата данни Northwind:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Първата и третата части на този SQL команда са всъщност две заявки за избиране. Тези заявки извличат два различни набора от записи; един от таблицата Поръчки за продукта и друг от таблицата Закупуване на продукт.

Втората част на тази SQL команда е ключовата дума UNION, която казва на Access, че тази заявка ще комбинира тези два набора от записи.

Последната част от тази SQL команда определя подреждането на обединените записи с помощта на командата ORDER BY. В този пример Access ще подреди всички записи по полето "Дата на поръчка" в низходящ ред.

Забележка: Заявките за обединение в Access са винаги само за четене – не може да променяте стойности в изглед на лист с данни.

Създаване на заявка за обединение чрез създаване и комбиниране на заявки за избиране

Въпреки че можете да създадете заявка за обединение чрез директно писане на SQL синтаксис в SQL изглед, може да решите, че е по-лесно да го създадете на части със заявки за избиране. След това можете да копирате и поставите SQL частите в комбинирана заявка за обединение.

Ако вместо това искате да пропуснете стъпките за четене и да разгледате примера, вижте следващия раздел Разглеждане на пример за създаване на заявка за обединение.

  1. В раздела Създаване, в групата Заявки щракнете върху Проектиране на заявки.

  2. Щракнете двукратно върху таблицата, съдържаща полетата, които искате да включите. Таблицата се добавя към прозореца за проектиране на заявки.

  3. В прозореца за проектиране на заявки щракнете двукратно върху всяко от полетата, което искате да включите. Когато избирате полета, уверявайте се, че добавяте същия брой полета и в същия ред както към другите заявки за избиране. Обръщайте внимание на типовете данни на полетата и се уверявайте, че те са съвместими с типовете данни на полетата в същите позиция в другите заявки, които комбинирате. Ако например вашата първа заявка за избиране има пет полета, първото от които съдържа данни за дата/час, уверете се, че всяка от другите заявки за избиране, които комбинирате, има също пет полета, първото от които съдържа данни за дата/час, и т. н.

  4. По желание можете да добавите критерии към вашите полета, като въведете подходящи изрази в реда "Критерии" на мрежата с полета.

  5. След като завършите добавянето на полета и критерии за полетата, трябва да изпълните заявка за избиране и да прегледате резултата от нея. В раздела Проектиране, в групата Резултати щракнете върху Изпълни.

  6. Превключете заявката в изглед за проектиране.

  7. Запишете заявката за избиране и я оставете отворена.

  8. Повторете тази процедура за всяка заявка за избиране, която искате да комбинирате.

След като сте създали вашите заявки за избиране, е време да ги комбинирате. В тази стъпка можете да създадете заявка за обединение чрез копиране и поставяне на SQL команди.

  1. В раздела Създаване, в групата Заявки щракнете върху Проектиране на заявки.

  2. В раздела Проектиране, В групата Заявка щракнете върху Обединение. Access скрива прозореца за проектиране на заявки и показва раздела за обекти в SQL изглед. На този етап разделът за обекти в SQL изглед е празен.

  3. Щракнете върху раздела за първата заявка за избиране, която искате да комбинирате в заявка за обединение.

  4. В раздела Начало щракнете върху Изглед > SQL изглед.

  5. Копирайте SQL командата за заявката за избиране. Щракнете върху раздела за заявка за обединение, която сте започнали да създавате преди.

  6. Поставете SQL командата за заявката за избиране в раздела за обекти "SQL изглед" на заявка за обединение.

  7. Изтрийте знака точка и запетая (;) в края на SQL командата за заявка за избиране.

  8. Натиснете клавиша Enter, за да преместите курсора един ред надолу, и след това въведете UNION на новия ред.

  9. Щракнете върху раздела за следващата заявка за избиране, която искате да комбинирате в заявка за обединение.

  10. Повтаряйте стъпките от 5 до 10, докато не копирате и поставите всички SQL команди за заявки за избиране в прозореца за SQL изглед на заявката за обединение. Не изтривайте знака точка и запетая и не въвеждайте нищо след SQL командата за последната заявка за избиране.

  11. В раздела Структура, в групата Резултати щракнете върху Изпълни.

Резултатите от вашата заявка за обединение се появяват в изглед на лист с данни.

Разглеждане на пример за създаване на заявка за обединение

Ето един пример, който можете да създадете отново в примерната база данни Northwind. Тази заявка за обединение събира имената на хората от таблицата Клиенти и ги свързва с имената на хората от таблицата Доставчици. Ако искате да продължите, работете с тези стъпки във вашето копие на примерната база данни Northwind.

Вашият браузър не поддържа видео. Инсталирайте Microsoft Silverlight, Adobe Flash Player или Internet Explorer 9.

Ето стъпките, необходими за създаване на този пример:

  1. Създайте две заявки за избиране, наречени "Заявка1" и "Заявка2", съответно с таблиците "Клиенти" и "Доставчици" като източници на данни. Използвайте полетата "Собствено име" и "Фамилно име" като показвани стойности.

  2. Създайте нова заявка, наречена "Заявка3", първоначално без източник на данни и след това щракнете върху командата Обединение в раздела Проектиране, за да превърнете тази заявка в заявка за обединение.

  3. Копирайте и поставете SQL командите от Заявка1 и Заявка2 в Заявка3. Не забравяйте да премахнете допълнителните точка и запетая и да добавите ключовата дума UNION. След това можете да проверите вашите резултати в изглед на лист с данни.

  4. Добавете клауза за поръчване в една от заявките и поставете командата ORDER BY в заявката за обединение в SQL изглед. Обърнете внимание, че в заявката за обединение Заявка3, непосредствено преди да бъде добавено подреждането, първо се премахват точките и запетаите и след това името на таблицата от имената на полетата.

  5. Последната SQL, която комбинира и сортира имената в този пример за заявка за обединение, е следната:

    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];

Ако нямате проблеми да пишете SQL синтаксис, със сигурност можете да напишете свои собствени SQL команди за заявка за обединение директно в SQL изглед. Може обаче да решите, че е полезно да използвате подхода с копиране и поставяне на SQL от други обекти на заявката. Всяка заявка може да бъде много по-сложна от простите примери за заявки за избиране, използвани тук. Може да се окаже от полза да създадете и внимателно да тествате всяка заявка, преди да ги комбинирате в заявка за обединение. Ако заявката за обединение не успее да се изпълни, можете да донастроите всяка заявка поотделно, докато успее, а след това отново да сглобите вашата заявка за обединение с правилния синтаксис.

Прегледайте останалите раздели на тази статия, за да научите повече съвети и трикове при използването на заявки за обединение.

В примера от предишния раздел, използващ базата данни Northwind, се комбинират данни само от две таблици. Можете обаче много лесно да комбинирате три или повече таблици в заявка за обединение. Например като използвате предишния пример, бихте могли да включите в резултата от заявката и имената на Служители. Може да изпълните тази задача, като добавите трета заявка и да я комбиниране с предишната SQL команда с допълнителна ключова дума UNION по следния начин:

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];

Когато покажете резултата в изглед на лист с данни, ще бъдат изброени всички служители с примерното име на фирма, което вероятно не е много полезно. Ако искате това поле да показва дали даден човек е служител от фирмата или от доставчик или клиент, можете да включите фиксирана стойност вместо името на фирмата. Ето как би изглеждала 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];

Ето как изглежда резултатът в изглед на лист с данни. Access показва следните пет примерни записа:

Длъжност

Фамилно име

Собствено име

От фирмата

Михайлова

Рада

От фирмата

Григорова

Неделя

Доставчик

Тасев

Драган

Клиент

Божилов

Радослав

Клиент

Червенков

Райко

Горната заявка може да се опрости още повече, тъй като Access чете в заявката за обединение само имената на изходните полета от първата заявка. Тук виждате, че сме премахнали резултата от разделите по втората и третата заявка:

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 подреждането се разрешава само веднъж, но всяка заявка може да се филтрира поотделно. Въз основа на заявката за обединение от предишния раздел, предлагаме ви пример, в който сме филтрирали всяка заявка чрез добавяне на клаузата 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];

Превключете към изглед на лист с данни, и ще видите резултат, подобен на този:

Длъжност

Фамилно име

Собствено име

Доставчик

Боянова

Боряна

От фирмата

Михайлова

Рада

Клиент

Ангелов

Радомир

От фирмата

Божилова

Людмила

Доставчик

Стоянова

Снежана

Клиент

Гинчев

Цветан

Доставчик

Филипов

Михаил

Доставчик

Банков

Мартин

От фирмата

Христов

Вълко

Доставчик

Кирякова

Корнелия

От фирмата

Илиев

Веселин

Ако заявките за обединение са много различни, може да се сблъскате със ситуация, при която изходното поле трябва да комбинира данни от различни типове. Ако е така, заявката за обединение най-често ще върне резултатите като текстови данни тъй като този тип данни може да съдържа както текст, така и числа.

За да разберете как работи това, ще използваме заявката за обединение Транзакции на продукти в примерната база данни Northwind. Отворете тази примерна база данни и след това отворете заявката "Транзакции на продукти" в изглед на лист с данни. Последните десет записа трябва да бъдат подобни на този резултат:

ИД на продукт

Дата на поръчката

Име на фирма

Транзакция

Количество

77

22.1.2006 г.

Доставчик Б

Покупка

60

80

22.1.2006 г.

Доставчик Г

Покупка

75

81

22.1.2006 г.

Доставчик А

Покупка

125

81

22.1.2006 г.

Доставчик А

Покупка

200

7

20.1.2006 г.

Фирма Г

Продажба

10

51

20.1.2006 г.

Фирма Г

Продажба

10

80

20.1.2006 г.

Фирма Г

Продажба

10

34

15.1.2006 г.

Фирма AA

Продажба

100

80

15.1.2006 г.

Фирма AA

Продажба

30

Да предположим, че искате полето "Количество" да бъде разделено на две – "Покупка" и "Продажба". Също така да предположим, че искате да има фиксирана стойност 0 в полетата, в които няма стойност. Ето как ще изглежда 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; 

Ако превключите към изглед на лист с данни, ще видите, че последните десет записа сега изглеждат по следния начин:

ИД на продукт

Дата на поръчката

Име на фирма

Транзакция

Закупуване

Продажба

74

22.1.2006 г.

Доставчик Б

Покупка

20

0

77

22.1.2006 г.

Доставчик Б

Покупка

60

0

80

22.1.2006 г.

Доставчик Г

Покупка

75

0

81

22.1.2006 г.

Доставчик А

Покупка

125

0

81

22.1.2006 г.

Доставчик А

Покупка

200

0

7

20.1.2006 г.

Фирма Г

Продажба

0

10

51

20.1.2006 г.

Фирма Г

Продажба

0

10

80

20.1.2006 г.

Фирма Г

Продажба

0

10

34

15.1.2006 г.

Фирма AA

Продажба

0

100

80

15.1.2006 г.

Фирма AA

Продажба

0

30

Продължавайки с този пример, какво би станало, ако искате полетата с нула да бъдат празни? Можете да модифицирате SQL командата, така че да не се показва нищо вместо да се показва нула, като добавите ключовата дума 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;

Тъй като обаче може да се случи превключване към изглед на лист с данни, сега имате неочакван резултат. В колоната "Закупуване" се изчистват всички полета:

ИД на продукт

Дата на поръчката

Име на фирма

Транзакция

Закупуване

Продажба

74

22.1.2006 г.

Доставчик Б

Покупка

77

22.1.2006 г.

Доставчик Б

Покупка

80

22.1.2006 г.

Доставчик Г

Покупка

81

22.1.2006 г.

Доставчик А

Покупка

81

22.1.2006 г.

Доставчик А

Покупка

7

20.1.2006 г.

Фирма Г

Продажба

10

51

20.1.2006 г.

Фирма Г

Продажба

10

80

20.1.2006 г.

Фирма Г

Продажба

10

34

15.1.2006 г.

Фирма AA

Продажба

100

80

15.1.2006 г.

Фирма AA

Продажба

30

Причината това да се случи е, че Access определя типовете данни на полетата от първата заявка. В този пример Null не е число.

Така че какво ще се случи, ако опитате да вмъкнете празен низ като празна стойност на поле? SQL командата за този опит може да изглежда подобно на следната:

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;

Когато превключите към изглед на лист с данни, ще видите, че Access извлича стойностите за "Закупуване", но конвертира тези стойности в текст. Можете да кажете, че това са текстови стойности, тъй като те са подравнени отляво, в изглед на лист с данни. Празният низ в първата заявката не е число и затова виждате такива резултати. Ще забележите, че стойностите на продажба също се конвертират в текст, тъй като записите за покупка съдържат празен низ.

ИД на продукт

Дата на поръчката

Име на фирма

Транзакция

Закупуване

Продажба

74

22.1.2006 г.

Доставчик Б

Покупка

20

77

22.1.2006 г.

Доставчик Б

Покупка

60

80

22.1.2006 г.

Доставчик Г

Покупка

75

81

22.1.2006 г.

Доставчик А

Покупка

125

81

22.1.2006 г.

Доставчик А

Покупка

200

7

20.1.2006 г.

Фирма Г

Продажба

10

51

20.1.2006 г.

Фирма Г

Продажба

10

80

20.1.2006 г.

Фирма Г

Продажба

10

34

15.1.2006 г.

Фирма AA

Продажба

100

80

15.1.2006 г.

Фирма AA

Продажба

30

И така, как да решите този проблем?

Решението е да принудите заявката да очаква стойността на полето да бъде число. Това може да се извърши с израза:

IIf(False, 0, Null)

Условието, което проверявате, False, никога няма да бъде True, следователно изразът винаги ще връща Null, но Access все още изчислява и двете числови опции и решава, че резултатът е число или Null.

Ето как да използвате този израз в нашия работен пример:

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;

Обърнете внимание, че не е необходимо да модифицирате втората заявка.

Ако превключите към изглед на лист с данни, вече ще видите резултата, който искаме:

ИД на продукт

Дата на поръчката

Име на фирма

Транзакция

Закупуване

Продажба

74

22.1.2006 г.

Доставчик Б

Покупка

20

77

22.1.2006 г.

Доставчик Б

Покупка

60

80

22.1.2006 г.

Доставчик Г

Покупка

75

81

22.1.2006 г.

Доставчик А

Покупка

125

81

22.1.2006 г.

Доставчик А

Покупка

200

7

20.1.2006 г.

Фирма Г

Продажба

10

51

20.1.2006 г.

Фирма Г

Продажба

10

80

20.1.2006 г.

Фирма Г

Продажба

10

34

15.1.2006 г.

Фирма AA

Продажба

100

80

15.1.2006 г.

Фирма AA

Продажба

30

Може да постигнете същия резултат по друг начин, като добавите още една заявка в началото на заявките от заявката за обединение:

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 ви връща фиксирани стойности с типа данни, зададен от вас. Разбира се, че не искате резултатът от тази заявка да пречи на другите резултати, така че трикът за избягване на това е да включите клаузата WHERE към False:

WHERE False

Това е малък трик, тъй като това винаги е неистина, така че заявката не връща нищо. Като комбинираме тази команда със съществуващата SQL команда, стигаме до окончателната команда, както следва:

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;

Забележка: Комбинираната заявката в този пример при използване на базата данни Northwind връща 100 записа, докато двете отделни заявки връщат 58 и 43 записа, което прави общо 101 записа. Причината за това несъответствие е защото два записа не са уникални. Вижте раздела Работа с отделни записи в заявки за обединение с помощта на UNION ALL, за да научите как се решава този сценарий с помощта на UNION ALL.

Специален случай на заявка за обединение е да комбинирате набор от записи с един запис, който съдържа сумата на едно или повече полета.

Ето друг пример, който можете да създадете в примерната база данни Northwind, за да илюстрирате как да получите общата сума в заявка за обединение.

  1. Създайте нова проста заявка, за да покажете закупуването на бира (ИД на продукт = 34 в базата данни Northwind) с помощта на следния SQL синтаксис:

    SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    ORDER BY [Purchase Order Details].[Date Received];
  2. Превключете към изглед на лист с данни, и би трябвало да видите четири покупки:

    Дата на получаване

    Количество

    22.1.2006 г.

    100

    22.1.2006 г.

    60

    4.4.2006 г.

    50

    5.4.2006 г.

    300

  3. За да получите общата сума, създайте проста заявка за събиране с помощта на следната SQL команда:

    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
  4. Превключете към изглед на лист с данни, и би трябвало да видите само една покупка:

    ПоследнаДата на получаване

    СумаНаКоличествата

    5.4.2006 г.

    510

  5. Комбинирайте тези две заявки в заявка за обединение, за да добавите записа с общото количество към записите за покупка:

    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. Превключете към изглед на лист с данни, и би трябвало да видите четирите покупки със сумата на всяка от тях, последвани от запис с общата сума на количеството:

    Дата на получаване

    Количество

    22.1.2006 г.

    60

    22.1.2006 г.

    100

    4.4.2006 г.

    50

    5.4.2006 г.

    300

    5.4.2006 г.

    510

Това обхваща основите на добавянето на общи суми в заявка за обединение. Може и да се наложи да включите фиксирани стойности и в двете заявки – например "Подробни данни" и "Общо", за да отделите визуално записа с общата сума от другите записи. Можете да прегледате чрез фиксирани стойности в раздел Комбиниране на три или повече таблици или заявки в заявка за обединение.

Заявките за обединение в Access по подразбиране включват само отделни записи. Какво обаче става, ако искате да включите всички записи? Тук може да бъде полезен друг пример.

В предишния раздел ви показахме как да създадете обща сума в заявка за обединение. Променете SQL командата за тази заявка за обединение, така че да включва ИД на продукт = 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];

Превключете към изглед на лист с данни, и би трябвало да видите един малко заблуждаващ резултат:

Дата на получаване

Количество

22.1.2006 г.

100

22.1.2006 г.

200

Един запис естествено не връща два пъти количеството на общата сума.

Причината да виждате този резултат е, че в един ден едно и също количество шоколадови бонбони е продадено два пъти – както е записано в таблицата "Подробни данни за поръчка за покупка". Ето резултат от проста заявка за избиране, който показва и двата записа в примерната база данни Northwind:

ИД на поръчка за покупка

Продукт

Количество

100

Шоколад Northwind Traders

100

92

Шоколад Northwind Traders

100

В заявката за обединение, посочена по-рано, ще видите че полето "ИД на поръчка за покупка" не е включено и че двете полета не представляват два отделни записа.

Ако искате да включите всички записи, използвайте UNION ALL вместо UNION във вашата SQL команда. Това най-вероятно ще окаже влияние върху сортирането на резултатите, така че може да се наложи да включите клаузата ORDER BY, за да определите реда на сортиране. Ето е променената 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];

Превключете към изглед на лист с данни, и би трябвало да видите всички подробности в допълнение към общата сума като последен запис:

Дата на получаване

Общо

Количество

22.1.2006 г.

100

22.1.2006 г.

100

22.1.2006 г.

Общо

200

Разпространено използване на заявка за обединение е да служи като източник на записи за контрола на разгъващ се списък за формуляр. Може да използвате този разгъващ се списък, за да изберете стойност за филтриране на записите от формуляра. Например филтриране на записите за служителите по техните градове.

За да видите как действа това, ви предлагаме друг пример, който може да създадете в примерната база данни Northwind, за да илюстрирате този сценарий.

  1. Създайте проста заявка за избиране, като използвате следния SQL синтаксис:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
  2. Превключете към изглед на лист с данни, и би трябвало да видите следните резултати:

    Град

    Филтър

    Сиатъл

    Сиатъл

    Белвю

    Белвю

    Редмънд

    Редмънд

    Къркланд

    Къркланд

    Сиатъл

    Сиатъл

    Редмънд

    Редмънд

    Сиатъл

    Сиатъл

    Редмънд

    Редмънд

    Сиатъл

    Сиатъл

  3. Ако погледнете тези резултати, може да не получите голяма полза. Разгънете обаче тази заявка и я превърне в заявка за обединение с помощта на следната SQL команда:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees
    
    UNION
    
    SELECT "<All>", "*" AS Filter
    FROM Employees
    
    ORDER BY City;
  4. Превключете към изглед на лист с данни, и би трябвало да видите следните резултати:

    Град

    Филтър

    <Всички>

    *

    Белвю

    Белвю

    Къркланд

    Къркланд

    Редмънд

    Редмънд

    Сиатъл

    Сиатъл

    Access извършва обединение на деветте записа, показани по-рано, с фиксирани полета стойности <Всички> и "*".

    Тъй като тази клауза за обединение не съдържа UNION ALL, Access връща само различните записи, което означава, че всеки град се връща само веднъж с фиксирани еднакви стойности.

  5. Когато вече имате изпълнена заявка за обединение, показваща всяко име на град само веднъж, заедно с опция, която по същество избира всички градове, можете да използвате тази заявка като източник на записи за разгъващ се списък във формуляр. Като използвате този конкретен пример като модел, можете да създадете контрола на разгъващ се списък за формуляр, като зададете тази заявка като източник на записи за него, да зададете свойството "Ширина на колоната" за колоната "Филтър" да бъде 0 (нула), за да я скриете визуално, и след това да зададете свойството "Обвързана колона" да бъде 1, за да укажете индекса на втората колона. В свойството "Филтър" на самия формуляр можете да добавите код – например като следния, за да активирате филтър за формуляра с помощта на стойността на това, което е избрано в контролата на разгъващия се списък:

    Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'"
    Me.FilterOn = True

    Потребителят на формуляра може след това да филтрира записите от формуляра с име на определен град или да избере <Всички> за да бъде изведен списъкът на всички записи за всички градове.

Най-горе на страницата

Нуждаете ли се от още помощ?

Искате ли още опции?

Разгледайте ползите от абонамента, прегледайте курсовете за обучение, научете как да защитите устройството си и още.

Общностите ви помагат да задавате и отговаряте на въпроси, да давате обратна връзка и да получавате информация от експерти с богати знания.