לעתים ייתכן שתרצה לפרט את הרשומות מטבלה או שאילתה אחת יחד עם רשומות מטבלה אחרת אחת או יותר כדי ליצור ערכה אחת של רשומות - רשימה עם כל הרשומות משתי טבלאות או יותר. זוהי מטרתה של שאילתת איחוד ב- Access.
כדי להבין שאילתות איחוד בצורה יעילה, עליך להיות בקי בעיצוב שאילתות בחירה בסיסיות ב- Access. לקבלת מידע נוסף אודות עיצוב שאילתות בחירה, ראה יצירה של שאילתת בחירה פשוטה.
למידת דוגמה שימושית לשאילתת איחוד
אם מעולם לא יצרת שאילתת איחוד בעבר, מומלץ שתלמד תחילה דוגמה שימושית בתבנית Access של Northwind. באפשרותך לחפש את התבנית לדוגמה של Northwind בעמוד תחילת העבודה של Access על-ידי לחיצה על קובץ > חדש או להוריד עותק ישירות ממיקום זה: תבנית לדוגמה של Northwind.
לאחר ש- Access פותח את מסד הנתונים של Northwind, סגור את טופס תיבת הדו-שיח של הכניסה שמופיע תחילה ולאחר מכן הרחב את חלונית הניווט. לחץ על החלק העליון של חלונית הניווט ולאחר מכן בחר סוג אובייקט כדי לארגן את כל אובייקטי מסד הנתונים לפי הסוג שלהם. לאחר מכן, הרחב את הקבוצה שאילתות, ותראה שאילתה בשם Product Transactions.
ניתן להבחין בקלות בין שאילתות איחוד לאובייקטי שאילתה אחרים מאחר שיש להן סמל מיוחד הדומה לשני עיגולים השלובים זה בזה ומייצגים ערכה מאוחדת משתי ערכות:
בניגוד לשאילתות בחירה ופעולה רגילות, טבלאות אינן קשורות בשאילתת איחוד, כלומר לא ניתן להשתמש במעצב השאילתות הגרפי של 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 בשאילתת איחוד משולבת.
אם ברצונך לדלג על קריאת השלבים ולצפות במקום זאת בדוגמה, עיין בסעיף הבא, צפייה בדוגמה של בניית שאילתת איחוד.
-
בכרטיסיה יצירה, בקבוצה שאילתות, לחץ על עיצוב שאילתה.
-
לחץ פעמיים על הטבלה המכילה את השדות שברצונך לכלול. הטבלה נוספת לחלון עיצוב השאילתה.
-
בחלון עיצוב השאילתה, לחץ פעמיים על כל אחד מהשדות שברצונך לכלול. במהלך בחירת השדות, הקפד להוסיף את אותו מספר שדות, ובאותו סדר, שאתה מוסיף לשאילתות הבחירה האחרות. שים לב במיוחד לסוגי הנתונים של השדות וודא שהם מכילים סוגי נתונים תואמים לשדות באותו מיקום בשאילתות האחרות שאתה משלב. לדוגמה, אם שאילתת הבחירה הראשונה שלך מכילה חמישה שדות והשדה הראשון מבין החמישה מכיל נתוני תאריך/שעה, ודא שכל אחת משאילתות הבחירה האחרות שאתה משלב מכילה גם היא חמישה שדות כאשר השדה הראשון מבין החמישה מכיל נתוני תאריך/שעה, וכן הלאה.
-
באפשרותך גם להוסיף קריטריונים לשדות על-ידי הקלדת הביטויים המתאימים בשורה 'קריטריונים' ברשת השדות.
-
לאחר שאתה מסיים להוסיף שדות וקריטריוני שדות, עליך להפעיל את שאילתת הבחירה ולסקור את הפלט שלה. בכרטיסיה עיצוב, בקבוצה תוצאות, לחץ על הפעל.
-
העבר את השאילתה לתצוגת עיצוב.
-
שמור את שאילתת הבחירה והשאר אותה פתוחה.
-
חזור על הליך זה עבור כל אחת משאילתות הבחירה שברצונך לשלב.
כעת, לאחר יצירת שאילתות בחירה, הגיע הזמן לשלב אותן. בשלב זה, תיצור את שאילתת האיחוד על-ידי העתקה והדבקה של משפטי ה- SQL.
-
בכרטיסיה יצירה, בקבוצה שאילתות, לחץ על עיצוב שאילתה.
-
בכרטיסיה עיצוב, בקבוצה שאילתה, לחץ על איחוד. Access מסתיר את חלון עיצוב השאילתה, ומציג את כרטיסיית האובייקטים של תצוגת SQL. בשלב זה, כרטיסיית האובייקטים של תצוגת SQL ריקה.
-
לחץ על הכרטיסיה של שאילתת הבחירה הראשונה שברצונך לשלב בשאילתת האיחוד.
-
בכרטיסיה בית, לחץ על תצוגה > תצוגת SQL.
-
העתק את משפט ה- SQL של שאילתת הבחירה. לחץ על הכרטיסיה של שאילתת האיחוד שהתחלת ליצור קודם לכן.
-
הדבק את משפט ה- SQL של שאילתת הבחירה בכרטיסיית האובייקטים של תצוגת ה- SQL של שאילתת האיחוד.
-
מחק את תו הנקודה-פסיק (;) בסוף משפט ה- SQL של שאילתת הבחירה.
-
הקש Enter כדי להזיז את הסמן שורה אחת למטה, ולאחר מכן הקלד UNION בשורה החדשה.
-
לחץ על הכרטיסיה של שאילתת הבחירה הבאה שברצונך לשלב בשאילתת האיחוד.
-
חזור על שלבים 5 עד 10 עד שתעתיק ותדביק את כל משפטי ה- SQL של שאילתות הבחירה לתוך חלון תצוגת ה- SQL של שאילתת האיחוד. אל תמחק את תו הנקודה-פסיק ואל תקליד דבר לאחר משפט ה- SQL של שאילתת הבחירה האחרונה.
-
בכרטיסיה עיצוב, בקבוצה תוצאות, לחץ על הפעל.
תוצאות שאילתת האיחוד מופיעות בתצוגת גליון נתונים.
צפייה בדוגמה של בניית שאילתת איחוד
להלן דוגמה שתוכל ליצור מחדש במסד הנתונים לדוגמה של Northwind. שאילתת איחוד זו אוספת את שמות האנשים מהטבלה Customers ומשלבת אותם עם שמות האנשים מהטבלה Suppliers. אם אתה מעוניין לעקוב, בצע שלבים אלה בעותק של מסד הנתונים לדוגמה של Northwind.
אלה הם השלבים הדרושים לבניית דוגמה זו:
-
צור שתי שאילתות בחירה הנקראות 'שאילתה1' ו'שאילתה2', כשהטבלאות Customers ו- Suppliers משמשות בהתאמה כמקורות נתונים. השתמש בשדות First Name ו- Last Name כערכי תצוגה.
-
צור שאילתה חדשה בשם 'שאילתה3' ללא מקור נתונים בתחילה ולאחר מכן לחץ על הפקודה איחוד בכרטיסיה עיצוב כדי להפוך שאילתה זו לשאילתת איחוד.
-
העתק והדבק את משפטי ה- SQL מ'שאילתה1' ו'שאילתה2' ל'שאילתה3'. הקפד להסיר את תו הנקודה-פסיק העודף ולהוסיף את מילת המפתח UNION. לאחר מכן תוכל לבדוק את התוצאות בתצוגת גליון נתונים.
-
הוסף פסוקית קביעת סדר לאחת השאילתות ולאחר מכן הדבק את המשפט ORDER BY לתצוגת SQL של שאילתת האיחוד. שים לב שב'שאילתה3', שאילתת האיחוד, כאשר צירוף פסוקית קביעת הסדר עומד להתבצע, תחילה מוסרים תווי הנקודה-פסיק, ולאחר מכן מוסר שם הטבלה משמות השדות.
-
ה- 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 כדי להמחיש כיצד ניתן לקבל סכום כולל בשאילתת איחוד.
-
צור שאילתה פשוטה חדשה כדי להציג את הרכישה של בירות (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];
-
עבור לתצוגת גליון נתונים. אתה אמור לראות ארבע רכישות:
Date Received
Quantity
22/01/2006
100
22/01/2006
60
04/04/2006
50
05/04/2006
300
-
כדי לקבל את הסכום הכולל, צור שאילתה מצטברת פשוטה באמצעות ה- SQL הבא:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))
-
עבור לתצוגת גליון נתונים. אתה אמור לראות רשומה אחת בלבד:
MaxOfDate Received
SumOfQuantity
05/04/2006
510
-
שלב שתי שאילתות אלה בשאילתת איחוד כדי לצרף את הרשומה עם הכמות הכוללת לרשומות הרכישה:
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];
-
עבור לתצוגת גליון נתונים. אתה אמור לראות את ארבע הרכישות, כשאחרי הסכום של כל אחת מהן מוצגת רשומה המסכמת את הכמות:
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 להמחשת תרחיש זה.
-
צור שאילתת בחירה פשוטה באמצעות תחביר SQL זה:
SELECT Employees.City, Employees.City AS Filter FROM Employees;
-
עבור לתצוגת גליון נתונים. אתה אמור לראות את התוצאות הבאות:
City
Filter
Seattle
Seattle
Bellevue
Bellevue
Redmond
Redmond
Kirkland
Kirkland
Seattle
Seattle
Redmond
Redmond
Seattle
Seattle
Redmond
Redmond
Seattle
Seattle
-
ייתכן שלא תפיק תועלת רבה מתוצאות אלה, כפי שהן מוצגות. הרחב את השאילתה והמר אותה לשאילתת איחוד באמצעות ה- SQL הבא:
SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;
-
עבור לתצוגת גליון נתונים. אתה אמור לראות את התוצאות הבאות:
City
Filter
<All>
*
Bellevue
Bellevue
Kirkland
Kirkland
Redmond
Redmond
Seattle
Seattle
Access מבצע איחוד של תשע הרשומות, שהוצגו קודם לכן, באמצעות ערכי שדות קבועים של <All> ו- "*".
מאחר שפסוקית איחוד זו אינה מכילה את UNION ALL, Access מחזיר רשומות נפרדות בלבד, ומשמעות הדבר היא שכל עיר מוחזרת פעם אחת בלבד עם ערכים זהים קבועים.
-
כעת, כשיש לך שאילתת איחוד שלמה המציגה כל שם עיר פעם אחת בלבד, יחד עם אפשרות שבוחרת בצורה יעילה את כל הערים, באפשרותך להשתמש בשאילתה זו כמקור הרשומות עבור תיבה משולבת בטופס. על-ידי שימוש בדוגמה ספציפית זו כמודל, תוכל ליצור פקד תיבה משולבת בטופס, להגדיר שאילתה זו כמקור הרשומות שלו, להגדיר את המאפיין 'רוחב עמודה' של העמודה 'מסנן' ל- 0 (אפס) כדי להסתיר אותה באופן חזותי, ולאחר מכן להגדיר את המאפיין 'עמודה מאוגדת' ל- 1 כדי לציין את האינדקס של העמודה השניה. במאפיין 'מסנן' של הטופס עצמו, באפשרותך לאחר מכן להוסיף קוד כגון הקוד הבא כדי להפעיל מסנן טופס באמצעות הערך של הפריט שנבחר בפקד התיבה המשולבת:
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
המשתמש של הטופס יוכל לסנן את רשומות הטופס לשם עיר ספציפי או לבחור <All> כדי לפרט את כל הרשומות עבור כל הערים.