JOINS - Extra information
- class928417
- Aug 4, 2014
- 2 min read
חומר העשרה - רק למי שסיים את תרגילי הבית וצמא לעוד ידע:
עכשיו אני אעמיק קצת לדברים יותר מסובכים (אני גם אדבר על הנושא בכיתה, אבל נסו להבין):
אמרנו שלגבי Join, זה תלוי:
1. כל עוד מדובר ב Inner Join - אז אין היררכיה בין הטבלאות - ולכן לא חשוב מי ראשונה ומי שנייה. (אם יש עוד Inner Join לטבלה נוספת - זה עדיין לא משנה, וכן הלאה) כולם דומיננטיים, ואין היררכיה ביניהם.
2. לעומת זאת, אם מדובר ב Left Outer Join - אז חשוב שהטבלה המובילה תהיה ראשונה.
אם יש עוד Outer Join - אז חשוב לבדוק מי המוביל מכל השלישייה.
גם כאן יש 2 אופציות:
2.1. מבין 2 הטבלאות שנותרו, אם שתיהן עושות Join מול הטבלה המובילה (העליונה)
אז לא משנה מי שנייה ומי שלישית:
Select *
From Orders O ----> Level 1
Left Join Employees E ----> Level 2
On O.EmployeeID= E.EmployeeID
Left Join Customers Cu ----> Level 2
On O.CustomerID= Cu.CustomerID
זה אותו דבר כמו
Select *
From Orders O ----> Level 1
Left Join Customers Cu ----> Level 2
On O.CustomerID= Cu.CustomerID
Left Join Employees E ----> Level 2
On O.EmployeeID= E.EmployeeID
אבל:
2.2 אם מבין 2 הטבלאות שנותרו, הLeft Outer Join הוא ביניהן - אז גם פה צריך להחליט מי המובילה מבין השתיים.
בדרך כלל זה לא קשה, כי כמו בדוגמה הבאה, ברור שטבלת ערים (טבלה ש"המצאתי",לא קיימת אצלכם ב Northwind) תבוא אחרי טבלת עובדים - כי אין קשר בין טבלת ערים לטבלת הזמנות, ולא היינו יכולים לבצע את ה Join-ים בצורה אחרת.
Select *
From Orders O ----> Level 1
Left Join Employees E ----> Level 2
On O.EmployeeID= E.EmployeeID
Left Join Cities Ci ----> Level 3
On Ci.City_Code = E.Residence_City_Code
עכשיו בואו נסבך עוד קצת...
שימו לב!
אפשר בהחלט שחלק מהJoins יהיו OUTER וחלק INNER:
Select *
From Orders O ----> Level 1
Left Join Employees E ----> Join 1 ----> Level 2
On O.EmployeeID= E.EmployeeID
Inner Join Cities Ci ----> Join 2 ----> Level 1
On Ci.City_Code = E.Residence_City_Code
Join 1 - מבצע Left Outer Join בין Orders לבין Employees
לפי התנאי O.EmployeeID= E.EmployeeID
Join 2 - מבצע Inner Join בין התוצאה של Join 1 לבין Cities
לפי Ci.City_Code = E.Residence_City_Code
- עדיין יכול לקצץ רשומות של Orders !! - בגלל ה Inner Join
יבוטלו רשומות של Orders בהן Join 1 הביא NULL בעמודת Residence_City_Code (- הביא NULL בגלל ה Left Outer Join)
וגם רשומות שפשוט לא עושות "שידוך" בין Employees לבין Cities
לדוגמה: נגיד שבטבלת הזמנות יש לנו 100 הזמנות של עובד 11. עובד 11 נמצא בטבלת עובדים ושמו חיים. מן הסתם שמרנו על כל 100 הרשומות כי התקיים ה join .
אבל אם חיים גר בקוד עיר 12, ובטבלת ערים אין כזה קוד - אזי כל 100 ההזמנות של חיים לא ישלפו בשאילתא.
לעומת זאת, יש בטבלת הזמנות 200 הזמנות של עובד 12. עובד 12 לא נמצא בטבלת עובדים. בשלב הזה עדיין לא איבדנו רשומות כיוון שמדובר ב Left Outer Join - ובכל השדות מ Employees יהיה NULL. אבל- ברגע שהמשכנו ועשינו Inner Join עם טבלת Cities כל 200 ההזמנות של עובד 12 תקוצצנה - כיוון שה Join הוא לפי E.Residence_City_Code והוא הרי עם ערך NULL ברשומות אלה!
והתנאי Ci.City_Code = E.Residence_City_Code במקרה זה לא יתקיים.
מקווה שהצלחתי להיות ברור, נסו לבדוק לבד עם הנתונים.
כאמור- אסביר את זה גם בשיעור.
רן.
Recent Posts
See Allנוספו MDX עבור הפרויקט למי שמתקשה. נמצא בלשונית "project" שאול
הי, הוספתי בחלק של הפרויקט באתר מספר דוגמאות לתהליכים שונים משלב ה MRR וה - STG. אעדכן תוך כדי התקדמות הפרויקט. במידה ויש משהו שאתם...
המרצה במודול החדש ( מודול הפרויקט) פתח קבוצת פייסבוק לכיתה שלנו. הנה הלינק : https://www.facebook.com/groups/JBH9284.17/ שם הקבוצה :...
Comments