בפוסט זה – השני בסדרה, נדבר על טכניקות מעט יותר מתקדמות, טכניקות אלה דורשות הבנה בסיסית בשילוב בין טבלאותבפוסט זה אנו נעבור על הטכניקות הבאות : Non Equi Join, Outer Join , Self Join

הדוגמאות הבאות מתבססות על תחביר ה JOIN ה NOT ANSI, ניתן להשתמש בפוסט הבא כדי לעמוד על ההבדלים בינו לבין התחביר ה ANSI

Equi Join Non

לעתים, נרצה לשלב בין שתי טבלאות אשר אין בינהן עמודה משותפת ולכאורה אף תנאי מקשר  :

Non Equi Join

מהי דרגת השכר של משה? אמנם אין לנו עמודה משותפת, אך אנו יכולים לדעת כי הוא שייך לדרוג שכר 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

OUTER JOIN מאפשר לנו לשלב נתונים משתי טבלאות (או יותר) כאשר חלק מהנתונים אינם משותפים לשתי הטבלאות.

Outer Join

שילוב רגיל בין טבלאות אלו יוביל להצגת הנתונים הבאים (5 שורות סה"כ):

 

Outer Join

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

WHERE dep.department_id = emp.department_id

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

v     יובל לא מופיע כי מספר מחלקתו היא NULL ולא ניתן להשוות NULL לאף ערך בעמודת מספר מחלקה בטבלת מחלקות.

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

כדי להציג את כל הנתונים מצד אחד (שמאל או ימין) של הטבלה כולל אלו שאין להם נתונים להשוואה מהצד השני, נשתמש ב-Right OUTER JOIN או Left OUTER JOIN

 

Right 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 שורות סה"כ):

Outer Join 

Left OUTER JOIN

טבלת מחלקות לפי ההדגמה שלנו מופיעה בצד שמאל מבחינת המשוואה הכתובה במשפט 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

    

!         ע"י Outer Join אשר נלמד לפי תחביר זה, אין אפשרות לבצע Full Outer Join. כלומר, לא ניתן לשים את סימן ה- (+) משני צידי המשוואה.

SELF JOIN

Self 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 אנו מגדירים את הקשר הפנימי, במקרה זה אנו משווים בין מספר המנהל של העובד, לבין מספר העובד של המנהל (בפעם השניה אנחנו מתייחסים לטבלה כטבלת "מנהלים").