JOIN – שאילתות איחוד

‏ • 7 באוגוסט, 2004

רצוי לקרוא את המאמר על קשרי גומלין לפני קריאת מאמר זה.
שאילתות איחוד מאפשרות לנו לשלוף משתי טבלאות (ויותר ע"י שאילתות איחוד מקוננות) במקביל ע"פ תנאי מסוים.
קיימים מספר סוגים של שאילתות איחוד:


  • Inner Join

  • Outers Join:

    • Left Outer Join

    • Right Outer Join

    • Full Outer Join

  • Self Join

  • Cross Join

זהו התחביר של שאילתות איחוד:

FROM table1 
	 JOIN 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 table1  JOIN (
             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.= 

בשאילתת עדכון:

UPDATE 
     SET (t1|t2).=[,n...]
     FROM table1 t1  JOIN table2 t2
     [WHERE...] 

למידע נוסף אודות JOIN בשאילתות מחיקה ועדכון
Delete Statement – msdn
Update statement – msdn


הערות


*Outers Join בקריאה לא מפורשת לא יעבדו באקסס
*Cross Join בקריאה מפורשת לא עובד באקסס

להורדת בסיס הנתונים עם דוגמאות השאילתות לחץ כאן

בהצלחה!

תגיות: , , , , , , ,

ניר טייב

בונה אתרים ומתכנת בשפות:HTML, CSS, JavaScript, PHP 5, JSP&Servlets ורובי.

תגובות בפייסבוק