Join (SQL)
ב-SQL, Join היא פסקה (חלק משאילתא) לאיחוד שדות בין שתי טבלאות על ידי ערכים המשותפים לשתיהן.
תקן ה-ANSI ל-SQL מגדיר ארבעה סוגים של איחוד: פנימי (Inner), חיצוני (Outer), ימינה (Right) ושמאלה (Left). על המתכנת לכתוב פרדיקט עבור האיחוד כדי לזהות את הרשומות שיש לאחד. ברשומות בהן הפרדיקט חיובי, הרשומה מתאחדת לטבלת התוצאה בהתאם לפורמט.
איחוד פנימי (Inner Join) הוא האיחוד הנפוץ ביותר ביישומים ומשתמשים בו בדרך כלל בתור איחוד ברירת מחדל. איחוד פנימי יוצר טבלה חדשה על ידי שילוב שדות של שתי טבלאות המבוסס על פרדיקט האיחוד.
פעולת Join מקבילה במידה מסוימת למכפלה קרטזית בתורת הקבוצות - התוצאה היא תת-קבוצה מסוימת של הטבלה של "כל הזוגות הסדורים של שורה מהטבלה הראשונה ושורה מהטבלה השנייה".
דוגמאות
עבור הטבלאות:
|
|
בדוגמאות הללו פרדיקט האיחוד ידרוש תמיד שוויון בין שדה DepartmentID של הטבלה הראשונה לזה של הטבלה השנייה, אחרת נקבל גם רשומות שלא מעניינות אותנו, כגון:
Employee.LastName | Employee.DepartmentID | Department.DepartmentName | Department.DepartmentID |
---|---|---|---|
Robinson | 34 | Engineering | 33 |
Inner join
SELECT *
FROM employee
INNER JOIN department
USING (DepartmentID);
| |||
---|---|---|---|
Employee.LastName | Employee.DepartmentID | Department.DepartmentName | Department.DepartmentID |
Robinson | 34 | Clerical | 34 |
Jones | 33 | Engineering | 33 |
Smith | 34 | Clerical | 34 |
Steinberg | 33 | Engineering | 33 |
Rafferty | 31 | Sales | 31 |
Left outer join
התוצאה של איחוד עם left outer join (או בקיצור left join) עבור טבלאות A ו-B תכיל תמיד את כל הרשומות מהטבלה ה"שמאלית", אף אם תנאי האיחוד לא מוצא כל רשומה מתאימה בטבלה ה"ימנית" (B).
SELECT *
FROM employee LEFT OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID;
| |||
---|---|---|---|
Employee.LastName | Employee.DepartmentID | Department.DepartmentName | Department.DepartmentID |
Jones | 33 | Engineering | 33 |
Rafferty | 31 | Sales | 31 |
Robinson | 34 | Clerical | 34 |
Smith | 34 | Clerical | 34 |
John | NULL | NULL | NULL |
Steinberg | 33 | Engineering | 33 |
Right outer join
דומה ל־Left outer join אך בכיוון ההפוך.
SELECT *
FROM employee RIGHT OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID;
| |||
---|---|---|---|
Employee.LastName | Employee.DepartmentID | Department.DepartmentName | Department.DepartmentID |
Smith | 34 | Clerical | 34 |
Jones | 33 | Engineering | 33 |
Robinson | 34 | Clerical | 34 |
Steinberg | 33 | Engineering | 33 |
Rafferty | 31 | Sales | 31 |
NULL | NULL | Marketing | 35 |
קישורים חיצוניים
30272219Join (SQL)