לעתים ייתכן שתרצה לשלב רשומות מטבלה או שאילתה אחת עם רשומות מטבלה אחרת אחת או יותר לתוצאה בודדת. זה מה שעושה שאילתת איחוד ב- 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הבחירה. - הקש 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
אלה היסודות של הוספת סכומים כוללים לשאילתת איחוד. ייתכן שתרצה גם לכלול ערכים קבועים בשתי השאילתות, כגון "פירוט" ו"סכום כולל", כדי להפריד באופן חזותי בין רשומת הסכום הכולל לבין הרשומות האחרות. באפשרותך לבחון את השימוש בערכים קבועים בסעיף שילוב של שלוש טבלאות או שאילתות או יותר בשאילתת איחוד.
עבודה עם רשומות נפרדות בשאילתות איחוד באמצעות 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 |
בשאילתת האיחוד שצוינה קודם לכן, ניתן לראות שהשדה Purchase Order ID אינו כלול וששני השדות אינם מהווים שתי רשומות נפרדות.
אם ברצונך לכלול את כל הרשומות, השתמש במקום UNION בUNION ALL- 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 <הכל> * Bellevue Bellevue Kirkland Kirkland Redmond Redmond Seattle Seattle Access מבצע איחוד של תשע הרשומות, שהוצגו קודם לכן, באמצעות ערכי שדות קבועים של All> ו- <"*". מאחר שפסוקית איחוד זו אינה מכילה
UNION ALL, Access מחזיר רשומות נפרדות בלבד. משמעות הדבר היא שכל עיר מוחזרת פעם אחת בלבד עם ערכים זהים קבועים.כעת, כשיש לך שאילתת איחוד שלמה המציגה כל שם עיר פעם אחת בלבד, יחד עם אפשרות שבוחרת בצורה יעילה את כל הערים, באפשרותך להשתמש בשאילתה זו כמקור הרשומות עבור תיבה משולבת בטופס. על-ידי שימוש בדוגמה ספציפית זו כמודל, תוכל ליצור פקד תיבה משולבת בטופס, להגדיר שאילתה זו כמקור הרשומות שלו, להגדיר את המאפיין 'רוחב עמודה' של העמודה 'מסנן' ל- 0 (אפס) כדי להסתיר אותה באופן חזותי, ולאחר מכן להגדיר את המאפיין 'עמודה מאוגדת' ל- 1 כדי לציין את האינדקס של העמודה השניה.
Filterבמאפיין של הטופס עצמו, באפשרותך לאחר מכן להוסיף קוד כמו הקוד הבא כדי להפעיל מסנן טופס באמצעות הערך שנבחר בפקד התיבה המשולבת:Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = Trueהמשתמש של הטופס יוכל לסנן את רשומות הטופס לשם עיר ספציפי או לבחור <הכל> כדי לפרט את כל הרשומות עבור כל הערים.