בפוסט זה – השני בסדרה, נדבר על טכניקות מעט יותר מתקדמות, טכניקות אלה דורשות הבנה בסיסית בשילוב בין טבלאות. בפוסט זה אנו נעבור על הטכניקות הבאות : Non Equi Join, Outer Join , Self Join
הדוגמאות הבאות מתבססות על תחביר ה JOIN ה NOT ANSI, ניתן להשתמש בפוסט הבא כדי לעמוד על ההבדלים בינו לבין התחביר ה ANSI
לעתים, נרצה לשלב בין שתי טבלאות אשר אין בינהן עמודה משותפת ולכאורה אף תנאי מקשר :
מהי דרגת השכר של משה? אמנם אין לנו עמודה משותפת, אך אנו יכולים לדעת כי הוא שייך לדרוג שכר A, משום שהשוונו את שכרו לנתונים בטבלת דרוג השכר וראינו שהוא נמצא בין 500 ל 2000.
כדי לבצע את השילוב בין שתי טבלאות אלו נשתמש באופרציית BETWEEN :
SELECT emp.last_name , emp.salary , job.grade_level FROM employees emp, job_grades job WHERE emp.salary BETWEEN job.lowest_sal AND job.highest_sal
שילוב בין כל שתי טבלאות (או יותר) הוא אפשרי כל עוד אנו מוצאים תנאי הגיוני כלשהו אשר יקשר את הטבלאות יחדיו.
OUTER JOIN מאפשר לנו לשלב נתונים משתי טבלאות (או יותר) כאשר חלק מהנתונים אינם משותפים לשתי הטבלאות.
שילוב רגיל בין טבלאות אלו יוביל להצגת הנתונים הבאים (5 שורות סה"כ):
נשים לב כי יובל לא מופיע ומחלקת יחסי ציבור לא מופיעה, הסיבה לכך נעוצה בצורת ההשוואה בין הטבלאות. הרי כדי להשוות בין שתי טבלאות אלו אנו נכתוב :
WHERE dep.department_id = emp.department_id
כלומר, כל עוד יש שיוויון בין הערכים של עמודת מספר מחלקה בטבלת עובדים לערכים של עמודת מספר מחלקה בטבלת מחלקות יש להציג את הנתונים.
v יובל לא מופיע כי מספר מחלקתו היא NULL ולא ניתן להשוות NULL לאף ערך בעמודת מספר מחלקה בטבלת מחלקות.
v מחלקת יחסי ציבור לא מופיעה משום שמספרה הוא 30 ולא ניתן להשוות את ערך זה לאף ערך מעמודת מספר מחלקה בטבלת עובדים.
כדי להציג את כל הנתונים מצד אחד (שמאל או ימין) של הטבלה כולל אלו שאין להם נתונים להשוואה מהצד השני, נשתמש ב-Right OUTER JOIN או Left OUTER JOIN
טבלת עובדים לפי ההדגמה שלנו מופיעה בצד ימין מבחינת המשוואה הכתובה במשפט WHERE :
WHERE dep.department_id = emp.department_id (חלק שמאלי) (חלק ימני)
אם נרצה להציג את כל העובדים אשר קיימים בטבלה כולל אלו אשר אין להם מחלקה אנו נשתמש ב- Right OUTER JOIN ונוסיף את סימן ה (+) לצד השמאלי של המשוואה :
SELECT emp.last_name , emp.salary , dep.department_name FROM departments dep , employees emp WHERE dep.department_id (+) = emp.department_id
שילוב זה בין הטבלאות יוביל להצגת כל העובדים, כולל אלו אשר אין להם מחלקה (6 שורות סה"כ):
טבלת מחלקות לפי ההדגמה שלנו מופיעה בצד שמאל מבחינת המשוואה הכתובה במשפט WHERE :
WHERE dep.department_id = emp.department_id (חלק שמאלי) (חלק ימני)
אם נרצה להציג את כל המחלקות אשר קיימות בטבלה כולל אלו אשר אין להן עובדים אנו נשתמש ב- Left OUTER JOIN ונוסיף את סימן ה (+) לצד הימני של המשוואה :
SELECT emp.last_name , emp.salary , dep.department_name FROM departments dep , employees emp WHERE dep.department_id = emp.department_id (+)
שילוב זה בין הטבלאות אלו יוביל להצגת כל המחלקות, כולל אלו אשר אין בהן עובדים (6 שורות סה"כ):
! ע"י Outer Join אשר נלמד לפי תחביר זה, אין אפשרות לבצע Full Outer Join. כלומר, לא ניתן לשים את סימן ה- (+) משני צידי המשוואה.
טבלה זו מציגה היררכיה מסויימת של עובדים ומנהליהם כאשר מספר עובד מסויים יכול להיות שווה למספר מנהל :
(1) משה ß (2) יוסי
ß (3) דוד ß (4) אלי
ß (5) רועי ß (6) יובל
בטבלאות מסוג זה, לעתים, נרצה להציג נתונים המסתמכים על הקשר הפנימי של הטבלאות (מספר עובד שווה למספר מנהל).
לדוגמא, מהו שמו של המנהל של רועי? כדי לקבל תשובה נבדוק מהו מספר המנהל של רועי (3) ולאחר מכן נבדוק לאיזה מספר עובד מספר מנהל זה מתאים (דוד).
אנו יכולים להשתמש בקשר זה על מנת ליצור טבלה המציגה את שם העובד ושם מנהלו :
SELECT emp.employee_id , emp.last_name , emp.manager_id , mng.last_name FROM employees emp , employees mng WHERE emp.manager_id = mng.employee_id
מכיוון שאנו משלבים אותה טבלה לעצמה, אנו למעשה קוראים לאותה טבלה פעמיים, כל פעם בכינוי אחר. צורת שילוב טבלאות זו נקראת Self Join.
במשפט WHERE אנו מגדירים את הקשר הפנימי, במקרה זה אנו משווים בין מספר המנהל של העובד, לבין מספר העובד של המנהל (בפעם השניה אנחנו מתייחסים לטבלה כטבלת "מנהלים").