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

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

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

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

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

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

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

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

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

צילום מסך של סמל שאילתת איחוד ב- 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 זה הם למעשה שתי שאילתות בחירה. שאילתות אלה מאחזרות שתי ערכות שונות של רשומות; אחת מהטבלה 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. שמור את שאילתת הבחירה והשאר אותה פתוחה.

  9. חזור על הליך זה עבור כל אחת משאילתות הבחירה שברצונך לשלב.

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

  1. בכרטיסיה יצירה, בקבוצה שאילתות, לחץ על עיצוב שאילתה.

  2. סגור את תיבת הדו-שיח הצגת טבלה.

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

  4. לחץ על הכרטיסיה של שאילתת הבחירה הראשונה שברצונך לשלב בשאילתת האיחוד.

  5. בכרטיסיה בית, לחץ על תצוגה > תצוגת SQL.

  6. העתק את משפט ה- SQL של שאילתת הבחירה. לחץ על הכרטיסיה של שאילתת האיחוד שהתחלת ליצור קודם לכן.

  7. הדבק את משפט ה- SQL של שאילתת הבחירה בכרטיסיית האובייקטים של תצוגת ה- SQL של שאילתת האיחוד.

  8. מחק את תו הנקודה-פסיק (;) בסוף משפט ה- SQL של שאילתת הבחירה.

  9. הקש Enter כדי להזיז את הסמן שורה אחת למטה, ולאחר מכן הקלד UNION בשורה החדשה.

  10. לחץ על הכרטיסיה של שאילתת הבחירה הבאה שברצונך לשלב בשאילתת האיחוד.

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

  12. בכרטיסיה עיצוב, בקבוצה תוצאות, לחץ על הפעל.

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

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

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

הדפדפן שלך אינו תומך בווידאו. התקן את Microsoft Silverlight‏, Adobe Flash Player או Internet Explorer 9.

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

  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 ו- 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

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

שאילתות איחוד ב- 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

בשאילתת האיחוד שצוינה קודם לכן, ניתן לראות שהשדה Purchase Order ID אינו כלול וששני השדות אינם מהווים שתי רשומות נפרדות.

אם ברצונך לכלול את כל הרשומות, השתמש ב- 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

    <All>

    *

    Bellevue

    Bellevue

    Kirkland

    Kirkland

    Redmond

    Redmond

    Seattle

    Seattle

    Access מבצע איחוד של תשע הרשומות, שהוצגו קודם לכן, באמצעות ערכי שדות קבועים של <All> ו- "*".

    מאחר שפסוקית איחוד זו אינה מכילה את UNION ALL‏, Access מחזיר רשומות נפרדות בלבד, ומשמעות הדבר היא שכל עיר מוחזרת פעם אחת בלבד עם ערכים זהים קבועים.

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

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

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

לראש הדף

שפר את הכישורים שלך ב- Office
סייר בהדרכה
קבל תכונות חדשות לפני כולם
הצטרף למשתתפי Office Insider

האם מידע זה היה שימושי?

תודה על המשוב!

תודה על המשוב! נראה שכדאי לקשר אותך לאחד מנציגי התמיכה של Office.

×