שימוש בשאילתת איחוד כדי לשלב שאילתות מרובות לתוצאה בודדת

חל על
Access של Microsoft 365 Access 2024 Access 2021 Access 2019 Access 2016

לעתים ייתכן שתרצה לשלב רשומות מטבלה או שאילתה אחת עם רשומות מטבלה אחרת אחת או יותר לתוצאה בודדת. זה מה שהשאילתת איחוד עושה ב- Access.

כדי להבין שאילתות איחוד בצורה יעילה, עליך להיות בקי בעיצוב שאילתות בחירה בסיסיות ב- Access. לקבלת מידע נוסף אודות עיצוב שאילתות בחירה, ראה יצירה של שאילתת בחירה פשוטה.

למידת דוגמה שימושית לשאילתת איחוד

אם מעולם לא יצרת שאילתת איחוד בעבר, מומלץ ללמוד תחילה דוגמה עובדת בתבנית Access של Northwind. באפשרותך לחפש את התבנית לדוגמה של Northwind בדף תחילת העבודה של Access על-ידי בחירת קובץ>חדש. באפשרותך גם להוריד עותק ישירות מתבנית לדוגמה של Northwind.

לאחר ש- Access פותח את מסד הנתונים של Northwind, סגור את תיבת הדו-שיח של הכניסה שמופיעה תחילה ולאחר מכן הרחב את חלונית הניווט. בחר את החלק העליון של חלונית הניווט ולאחר מכן בחר סוג אובייקט כדי לארגן את כל אובייקטי מסד הנתונים לפי סוג. לאחר מכן, הרחב את הקבוצה שאילתות, ותציג שאילתה בשם Product Transactions.

ניתן להבחין בקלות בין שאילתות איחוד לאובייקטי שאילתה אחרים מאחר שיש להן סמל מיוחד הדומה לשני עיגולים השלובים זה בזה ומייצגים ערכה מאוחדת משתי ערכות:

צילום מסך של סמל שאילתת איחוד ב- Access. בניגוד לשאילתות בחירה ופעולה רגילות, טבלאות אינן קשורות בשאילתת איחוד. משמעות הדבר היא שלא ניתן להשתמש במעצב השאילתות של הגרפיקה של Access כדי לבנות או לערוך שאילתות איחוד. אם אתה פותח שאילתת איחוד מחלונית הניווט, Access פותח אותה ומציג את התוצאות בתצוגת גליון נתונים. תחת תצוגות בכרטיסיה בית , שים לב שתצוגת עיצוב אינה זמינה בעת עבודה עם שאילתות איחוד. באפשרותך לעבור רק בין תצוגת גליון נתונים לתצוגתSQL.

כדי להמשיך ללמוד דוגמה זו של שאילתת איחוד, לחץ על תצוגת> SQLשל>תצוגות בית כדי להציג את SQL התחביר המגדיר אותה. באיור זה, הוספנו SQL מרווח נוסף ב- כדי שתוכל לראות בקלות את החלקים השונים המהווים שאילתת איחוד.

הבה נבחן בפירוט את 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 זה הם למעשה שתי שאילתות בחירה. שאילתות אלה מאחזרות שתי ערכות שונות של רשומות; אחת מהטבלה Product Orders והשניה מהטבלה Product Purchases.

החלק השני של משפט זה הוא SQL מילת המפתח UNION , אשר מורה ל- Access לשלב שתי קבוצות אלה של רשומות.

החלק האחרון של משפט SQL זה קובע את סדר הרשומות המשולבות באמצעות ORDER BY משפט. בדוגמה זו, Access מסדר את כל הרשומות לפי השדה Order Date בסדר יורד.

הערה

שאילתות איחוד מוגדרות תמיד לקריאה בלבד ב- Access; לא ניתן לשנות ערכים כלשהם בתצוגת גליון נתונים.

יצירת שאילתת איחוד על-ידי יצירה ושילוב של שאילתות בחירה

למרות שניתן ליצור שאילתת איחוד על-ידי כתיבת SQL התחביר ישירות בתצוגת SQL, ייתכן שיהיה לך קל יותר לבנות אותה בחלקים באמצעות שאילתות בחירה. לאחר מכן תוכל להעתיק ולהדביק את חלקי ה- SQL בשאילתת איחוד משולבת.

אם ברצונך לדלג על קריאת השלבים ולצפות במקום זאת בדוגמה, עיין בסעיף הבא, צפייה בדוגמה של בניית שאילתת איחוד.

  1. בכרטיסיה יצירה, בקבוצה שאילתות, לחץ על עיצוב שאילתה.
  2. לחץ פעמיים על הטבלה המכילה את השדות שברצונך לכלול. הטבלה נוספת לחלון עיצוב השאילתה.
  3. בחלון עיצוב השאילתה, לחץ פעמיים על כל אחד מהשדות שברצונך לכלול. במהלך בחירת השדות, הקפד להוסיף את אותו מספר שדות, ובאותו סדר, שאתה מוסיף לשאילתות הבחירה האחרות. שים לב במיוחד לסוגי הנתונים של השדות וודא שהם מכילים סוגי נתונים תואמים לשדות באותו מיקום בשאילתות האחרות שאתה משלב. לדוגמה, אם שאילתת הבחירה הראשונה שלך מכילה חמישה שדות והשדה הראשון מבין החמישה מכיל נתוני תאריך/שעה, ודא שכל אחת משאילתות הבחירה האחרות שאתה משלב מכילה גם היא חמישה שדות כאשר השדה הראשון מבין החמישה מכיל נתוני תאריך/שעה, וכן הלאה.
  4. באפשרותך גם להוסיף קריטריונים לשדות על-ידי הקלדת הביטויים המתאימים בשורה 'קריטריונים' ברשת השדות.
  5. לאחר שאתה מסיים להוסיף שדות וקריטריוני שדות, עליך להפעיל את שאילתת הבחירה ולסקור את הפלט שלה. בכרטיסיה עיצוב, בקבוצה תוצאות, לחץ על הפעל.
  6. העבר את השאילתה לתצוגת עיצוב.
  7. שמור את שאילתת הבחירה והשאר אותה פתוחה.
  8. חזור על הליך זה עבור כל אחת משאילתות הבחירה שברצונך לשלב.

כעת, לאחר שיצרת את שאילתות הבחירה, הגיע הזמן לשלב אותן. בשלב זה, תיצור את שאילתת האיחוד על-ידי העתקה והדבקה של SQL המשפטים.

  1. בכרטיסיה יצירה, בקבוצה שאילתות, לחץ על עיצוב שאילתה.
  2. בכרטיסיה עיצוב, בקבוצה שאילתה, לחץ על איחוד. Access מסתיר את חלון עיצוב השאילתה ומציג את כרטיסיית האובייקטים של תצוגת SQL. בשלב זה, הכרטיסיה ריקה.
  3. לחץ על הכרטיסיה של שאילתת הבחירה הראשונה שברצונך לשלב בשאילתת האיחוד.
  4. בכרטיסיה בית , לחץ על הצג תצוגת>SQL.
  5. העתק את SQL המשפט עבור שאילתת הבחירה. לחץ על הכרטיסיה של שאילתת האיחוד שהתחלת ליצור קודם לכן.
  6. הדבק את SQL המשפט עבור שאילתת הבחירה בכרטיסית האובייקטים של תצוגת SQL של שאילתת האיחוד.
  7. מחק את תו הנקודה-פסיק (;) בסוף משפט שאילתת SQL הבחירה.
  8. הקש Enter כדי להזיז את הסמן שורה אחת למטה ולאחר מכן הקלד UNION בשורה החדשה.
  9. לחץ על הכרטיסיה של שאילתת הבחירה הבאה שברצונך לשלב בשאילתת האיחוד.
  10. חזור על שלבים 5 עד 10 SQL עד שתעתק ותדביק את כל המשפטים של שאילתות הבחירה בחלון תצוגת SQL של שאילתת האיחוד. אל תמחק את תו הנקודה-פסיק ואל תקליד דבר לאחר המשפט SQL של שאילתת הבחירה האחרונה.
  11. בכרטיסיה עיצוב, בקבוצה תוצאות, לחץ על הפעל.

תוצאות שאילתת האיחוד מופיעות בתצוגת גליון נתונים.

צפייה בדוגמה של בניית שאילתת איחוד

להלן דוגמה שניתן ליצור מחדש במסד הנתונים לדוגמה של Northwind. שאילתת איחוד זו אוספת את שמות האנשים מהטבלה Customers ומשלבת אותם עם שמות האנשים מהטבלה Suppliers. אם אתה מעוניין לעקוב, בצע שלבים אלה בעותק של מסד הנתונים לדוגמה של Northwind.

אלה הם השלבים הדרושים לבניית דוגמה זו:

  1. צור שתי שאילתות בחירה הנקראות 'שאילתה1' ו'שאילתה2', כשהטבלאות Customers ו- Suppliers משמשות בהתאמה כמקורות נתונים. השתמש בשדות First Name ו- Last Name כערכי תצוגה.

  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 מציג חמש רשומות לדוגמה אלה:

Employment Last Name First Name
In-house Freehafer Nancy
In-house Giussani Laura
Supplier Glasson Stuart
Customer Goldschmidt Daniel
Customer Gratacos Solsona Antonio

באפשרותך להפחית את השאילתה אף יותר מאחר ש- 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];

עבור לתצוגת גליון נתונים כדי לראות תוצאות דומות לזו:

Employment Last Name First Name
Supplier Andersen Elizabeth A.‎
In-house Freehafer Nancy
Customer Hasselberg Jonas
In-house Hellung-Larsen Anne
Supplier Hernandez-Echevarria Amaya
Customer Mortensen Sven
Supplier Sandberg Mikael
Supplier Sousa Luis
In-house Thorpe Steven
Supplier Weiler Cornelia
In-house Zare Robert

ערבוב סוגי נתונים

אם השאילתות שאתה יוצר איגוד שונות מאוד, ייתכן שתיתקל במצב שבו שדה פלט חייב לשלב נתונים מסוגי נתונים שונים. במקרה זה, שאילתת האיחוד תחזיר לעתים קרובות את התוצאות כסוג נתונים של טקסט מאחר שסוג נתונים זה יכול להכיל גם טקסט וגם מספרים.

כדי להבין איך זה עובד, נשתמש בשאילתת האיחוד Product Transactions במסד הנתונים לדוגמה של Northwind. פתח את מסד הנתונים לדוגמה ולאחר מכן פתח את השאילתה Product Transactions בתצוגת גליון נתונים. עשר הרשומות האחרונות אמורות להיות דומות לפלט זה:

Product ID Order Date Company Name Transaction Quantity
77 22/01/2006 Supplier B Purchase 60
80 22/01/2006 Supplier D Purchase 75
81 22/01/2006 Supplier A Purchase 125
81 22/01/2006 Supplier A Purchase 200
7 20/01/2006 Company D Sale 10
51 20/01/2006 Company D Sale 10
80 20/01/2006 Company D Sale 10
34 15/01/2006 Company AA Sale 100
80 15/01/2006 Company AA Sale 30

נניח שברצונך לפצל את השדה Quantity לשני שדות: Buy and Sell. נניח גם שאתה מעוניין בערך אפס קבוע עבור השדה ללא ערך. כך נראית שאילתת 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;

אם תעבור לתצוגת גליון נתונים, תראה את עשר הרשומות האחרונות המוצגות כעת באופן הבא:

Product ID Order Date Company Name Transaction Buy Sell
74 22/01/2006 Supplier B Purchase 20 0
77 22/01/2006 Supplier B Purchase 60 0
80 22/01/2006 Supplier D Purchase 75 0
81 22/01/2006 Supplier A Purchase 125 0
81 22/01/2006 Supplier A Purchase 200 0
7 20/01/2006 Company D Sale 0 10
51 20/01/2006 Company D Sale 0 10
80 20/01/2006 Company D Sale 0 10
34 15/01/2006 Company AA Sale 0 100
80 15/01/2006 Company AA Sale 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;

עם זאת, כפי שהבחנת אולי בעת המעבר לתצוגת גליון נתונים, יש לך כעת תוצאה לא צפויה. בעמודה Buy, כל אחד מהשדות מנוקה:

Product ID Order Date Company Name Transaction Buy Sell
74 22/01/2006 Supplier B Purchase
77 22/01/2006 Supplier B Purchase
80 22/01/2006 Supplier D Purchase
81 22/01/2006 Supplier A Purchase
81 22/01/2006 Supplier A Purchase
7 20/01/2006 Company D Sale 10
51 20/01/2006 Company D Sale 10
80 20/01/2006 Company D Sale 10
34 15/01/2006 Company AA Sale 100
80 15/01/2006 Company AA Sale 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 מאחזר את הערכים של Buy, אך הוא ממיר את הערכים לטקסט. ניתן לדעת שמדובר בערכי טקסט מאחר שהם מיושרים לימין בתצוגת גליון נתונים. המחרוזת הריקה בשאילתה הראשונה אינה מספר, ולכן אתה רואה תוצאות אלה. אתה תבחין גם שערכי Sell מומרים גם הם לטקסט מכיוון שרשומות הרכישה מכילות מחרוזת ריקה.

Product ID Order Date Company Name Transaction Buy Sell
74 22/01/2006 Supplier B Purchase 20
77 22/01/2006 Supplier B Purchase 60
80 22/01/2006 Supplier D Purchase 75
81 22/01/2006 Supplier A Purchase 125
81 22/01/2006 Supplier A Purchase 200
7 20/01/2006 Company D Sale 10
51 20/01/2006 Company D Sale 10
80 20/01/2006 Company D Sale 10
34 15/01/2006 Company AA Sale 100
80 15/01/2006 Company AA Sale 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;

אין צורך לשנות את השאילתה השניה.

אם תעבור לתצוגת גליון נתונים, תראה תוצאה רצויה:

Product ID Order Date Company Name Transaction Buy Sell
74 22/01/2006 Supplier B Purchase 20
77 22/01/2006 Supplier B Purchase 60
80 22/01/2006 Supplier D Purchase 75
81 22/01/2006 Supplier A Purchase 125
81 22/01/2006 Supplier A Purchase 200
7 20/01/2006 Company D Sale 10
51 20/01/2006 Company D Sale 10
80 20/01/2006 Company D Sale 10
34 15/01/2006 Company AA Sale 100
80 15/01/2006 Company AA Sale 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

זה טריק קטן. מאחר שהתאי הוא תמיד 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. צור שאילתה פשוטה חדשה כדי להציג את הרכישה של בירות (Product ID=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. עבור לתצוגת גליון נתונים. אתה אמור לראות ארבע רכישות:

    Date Received Quantity
    22/01/2006 100
    22/01/2006 60
    04/04/2006 50
    05/04/2006 300
  3. כדי לקבל את הסכום הכולל, צור שאילתה מצטברת פשוטה באמצעות ה- SQL הבא:

    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
  4. עבור לתצוגת גליון נתונים. אתה אמור לראות רשומה אחת בלבד:

    MaxOfDate Received SumOfQuantity
    05/04/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. עבור לתצוגת גליון נתונים. אתה אמור לראות את ארבע הרכישות, כשאחרי הסכום של כל אחת מהן מוצגת רשומה המסכמת את הכמות:

    Date Received Quantity
    22/01/2006 60
    22/01/2006 100
    04/04/2006 50
    05/04/2006 300
    05/04/2006 510

אלה היסודות של הוספת סכומים כוללים לשאילתת איחוד. ייתכן שתרצה לכלול גם ערכים קבועים בשתי השאילתות, כגון "פירוט" ו"סכום כולל" כדי להפריד באופן חזותי בין הרשומה הכוללת לרשומות האחרות. באפשרותך לבחון את השימוש בערכים קבועים בסעיף שילוב של שלוש טבלאות או שאילתות או יותר בשאילתת איחוד.

עבודה עם רשומות נפרדות בשאילתות איחוד באמצעות UNION ALL

שאילתות איחוד ב- Access כוללות כברירת מחדל רק רשומות נפרדות. אבל כיצד תפעל אם ברצונך לכלול את כל הרשומות? דוגמה נוספת עשויה להיות שימושית כאן.

בסעיף הקודם, הראינו לך כיצד ליצור סכום כולל בשאילתת איחוד. שנה שאילתת איחוד זו כך SQL שתכלול: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];

עבור לתצוגת גליון נתונים. אתה אמור לראות תוצאה מטעה במידת מה:

Date Received Quantity
22/01/2006 100
22/01/2006 200

כמובן, רשומה אחת אינה מחזירה כמות כפולה מהכמות הכוללת.

אתה רואה תוצאה זו מכיוון, ביום אחד, אותה כמות של שוקולדים נמכרה פעמיים, כפי שנרשם בטבלה Purchase Order Details. להלן תוצאה של שאילתת בחירה פשוטה המציגה את שתי הרשומות במסד הנתונים לדוגמה של Northwind:

Purchase Order ID Product Quantity
100 Northwind Traders Chocolate 100
92 Northwind Traders Chocolate 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];

עבור לתצוגת גליון נתונים. אתה אמור לראות את כל הפרטים, בנוסף לסכום הכולל כרשומה האחרונה:

Date Received Total Quantity
22/01/2006 100
22/01/2006 100
22/01/2006 Total 200

שימוש בשאילתת איחוד כדי לסנן רשומות בטופס באמצעות פקד תיבה משולבת

שאילתת איחוד משמשת פעמים רבות כמקור הרשומות עבור פקד תיבה משולבת בטופס. באפשרותך להשתמש בתיבה משולבת כדי לבחור ערך שלפיו יש לסנן את רשומות הטופס. לדוגמה, סינון רשומות העובדים לפי העיר שלהם.

כדי לגלות כיצד הדבר עשוי לעבוד, הנה דוגמה נוספת שבאפשרותך ליצור במסד הנתונים לדוגמה של Northwind להמחשת תרחיש זה.

  1. צור שאילתת בחירה פשוטה באמצעות תחביר SQL זה:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
    
  2. עבור לתצוגת גליון נתונים. אתה אמור לראות את התוצאות הבאות:

    City Filter
    Seattle Seattle
    Bellevue Bellevue
    Redmond Redmond
    Kirkland Kirkland
    Seattle Seattle
    Redmond Redmond
    Seattle Seattle
    Redmond Redmond
    Seattle Seattle
  3. ייתכן שלא תפיק תועלת רבה מתוצאות אלה, כפי שהן מוצגות. עם זאת, הרחב את השאילתה ו הפוך אותה לשאילתת איחוד באמצעות :SQL

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees
    
    UNION
    
    SELECT "<All>", "*" AS Filter
    FROM Employees
    
    ORDER BY City;
    
  4. עבור לתצוגת גליון נתונים. אתה אמור לראות את התוצאות הבאות:

    City Filter
    <הכל> *
    Bellevue Bellevue
    Kirkland Kirkland
    Redmond Redmond
    Seattle Seattle

    Access מבצע איחוד של תשע הרשומות, שהוצגו בעבר, עם ערכי שדות קבועים מסוג <All> ו- "*". מאחר שפסוקית איחוד זו אינה מכילה UNION ALL, Access מחזיר רשומות נפרדות בלבד. משמעות הדבר היא שכל עיר מוחזרת פעם אחת בלבד עם ערכים זהים קבועים.

  5. כעת, כשיש לך שאילתת איחוד שלמה המציגה כל שם עיר פעם אחת בלבד, יחד עם אפשרות שבוחרת בצורה יעילה את כל הערים, באפשרותך להשתמש בשאילתה זו כמקור הרשומות עבור תיבה משולבת בטופס. על-ידי שימוש בדוגמה ספציפית זו כמודל, תוכל ליצור פקד תיבה משולבת בטופס, להגדיר שאילתה זו כמקור הרשומות שלו, להגדיר את המאפיין 'רוחב עמודה' של העמודה 'מסנן' ל- 0 (אפס) כדי להסתיר אותה באופן חזותי, ולאחר מכן להגדיר את המאפיין 'עמודה מאוגדת' ל- 1 כדי לציין את האינדקס של העמודה השניה. במאפיין Filter של הטופס עצמו, באפשרותך להוסיף קוד כגון זה כדי להפעיל מסנן טופס באמצעות הערך שנבחר בפקד התיבה המשולבת:

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

    המשתמש בטופס יכול לאחר מכן לסנן את <> רשומות הטופס לשם עיר ספציפי או לבחור הכל כדי להציג את כל הרשומות עבור כל הערים.

לראש הדף