JOIN – שאילתות איחוד
רצוי לקרוא את המאמר על קשרי גומלין לפני קריאת מאמר זה.
שאילתות איחוד מאפשרות לנו לשלוף משתי טבלאות (ויותר ע"י שאילתות איחוד מקוננות) במקביל ע"פ תנאי מסוים.
קיימים מספר סוגים של שאילתות איחוד:
- Inner Join
- Outers Join:
- Left Outer Join
- Right Outer Join
- Full Outer Join
- Self Join
- Cross Join
זהו התחביר של שאילתות איחוד:
FROM table1JOIN table2 ON table1.fieldName=table2.fieldName
ב-Inner Join ה-Inner הוא אופציונלי
2.קריאה לא מפורשת:
FROM table1 [INNER] JOIN table2 ON table1.fieldName=table2.fieldName
Left Outer Join
סוג שאילתת איחוד זאת שולפת את כל הרשומות מהטבלה שמשמאל לאופרטור, ואך ורק את הרשומות שנמצאו מתאימות בטבלה שמימין לאופרטור
רשומות שלא נמצאו להן התאמה בטבלה הימנית (לאופרטור) תקבלנה ערכי null בהתאם
תחביר:
קריאה מפורשת:
FROM table1, table2 WHERE table1.fieldName=table2.fieldName
*OUTER היא מילת רשות, באקסס חייבים להשמיט את המילה outer כי המנוע של אקסס לא מזהה אותה.
קריאה לא מפורשת:
FROM leftTable LEFT [outer] JOIN rightTable ON leftTable.fieldName=rightTable.fieldName
Right Outer Join
סוג שאילתת איחוד זו היא הפוכה מ-Left Join, כיוון ששאילתה זו מחזירה את כל הרשומות מהטבלה הימנית ואך ורק את את הרשומות שנמצאו מתאימות מהטבלה השמאלית.
רשומות ללא התאמה בטבלה שמשמאל לאופרטור תקבלנה NULL בהתאם
תחביר:
קריאה מפורשת:
FROM leftTable RIGHT [outer] JOIN rightTable ON leftTable.fieldName=rightTable.fieldName
*OUTER היא מילה אופציונלית, באקסס חייבים להשמיט את המילה outer כי המנוע של אקסס לא מזהה אותה.
קריאה לא מפורשת:
FROM leftTable,rightTable WHERE leftTable.fieldName=*rightTable.fieldName
Full Outer Join
שאילתת איחוד זו מחזירה את כל הרשומות משתי הטבלאות בהתאמה, ועבור רשומות הקיימות רק באחת מחזירה NULL בעבור השניה.
תחביר:
FROM leftTable FULL OUTER JOIN rightTable ON leftTable.fieldName=rightTable.fieldName
*אקסס לא תומך בסוג איחוד זה
*בSQL Server מאד לא מומלץ להגדיר את הOUTER JOIN בWhere clause. במקרים מסויימים פשוט יתקבלו תוצאות לא נכונות. לעומת זאת שימוש בANSI SYNTAX, מבטיח קבלה של תוצאות נכונות. שימו לב, שלא מדובר על קבלת הודעת שגיאה, אלה מדובר על קבלה של נתונים שגויים.
Self Join
סוג איחוד זה משמעותו היא שהטבלה עושה inner/outer Join לעצמה. בסוג איחוד זה (לאחר חיפוש רב של מידע) חייבים להשתמש ב-Table Alias וב-Inner/outer Join בקריאה לא מפורשת (משמע JOIN ב-WHERE)
תחביר:
FROM table1 t1, table2 t2 WHERE t1.fieldName=t2.fieldName
או:
FROM table1 t1 [INNER|Outer] JOIN table1 t2 ON t1.fieldName=t2.fieldName
t1 מייצג את טבלה table1 ו-t2 מייצג את הטבלה table2 שהם בעצם ה-ALIAS של הטבלאות. משום שסוג איחוד זה מאחד בין הטבלה לעצמה אפשר להסיק aאפשר לקשר כל עמודה לעצמה (העמודה המקבילה) מהטבלה השניה ולכן אפשר לעשות מס' תנאים באיחוד. דוגמא:
SELECT DISTINCT c1.ContactName,c2.ContactName, c1.Address, c1.City, c1.Region FROM Customers AS c1, Customers AS c2 WHERE c1.Region = c2.Region AND c1.Region is not null AND c2.Region is not null AND c1.ContactName <> c2.ContactName ORDER BY c1.Region, c1.ContactName;
Cross Join
Cross join הוא שאילתת איחוד ללא תנאים, וללא קישור בין עמודות.
תחביר:
FROM table1 CROSS JOIN table2
או
FROM table1,table2
פעולת Cross Join נפוצה מאוד עם WHERE לפילטור הממצאים (מהמילה Filter)
ריבוי תנאים לאיחוד
ע"י שימוש באופרטורים הלוגיים: AND ו-OR באפשרותנו לבצע יותר מתנאי אחד לאיחוד. לדוגמא:
SELECT fields FROM table1 INNER JOIN table2 ON table1.field1 compopr table2.field1 AND table1.field2 compopr table2.field2) OR table1.field3 compopr table2.field3)];
כאשר compopr זה אופרטור יחס ("=", "<>", "=<", "=>")
איחוד מקונן
באפשרותנו לבצע איחוד על תוצאה של איחודים אחרים ובכך לשלוף יותר משתי טבלאות.
תחביר:
FROM table1JOIN ( table2 JOIN [(] table3[ JOIN...)] ON table2.field=table3.field) ON table1.field=table2.field
איחוד טבלאות בשאילתות עדכון ומחיקה
הרעיון הוא להשתמש בסינטקס הרגיל של JOIN (על כל סוגיו) בשאילתת העדכון/מחיקה בחלק של פסוקית FROM
בשאילתת מחיקה:
DELETE FROM tbl1 t1 INNER JOIN tbl2 t2 ON t1.=t2. WHERE t1. =
בשאילתת עדכון:
UPDATESET (t1|t2). = [,n...] FROM table1 t1 JOIN table2 t2 [WHERE...]
למידע נוסף אודות JOIN בשאילתות מחיקה ועדכון
Delete Statement – msdn
Update statement – msdn
הערות
*Outers Join בקריאה לא מפורשת לא יעבדו באקסס
*Cross Join בקריאה מפורשת לא עובד באקסס
בהצלחה!
תגובות בפייסבוק