וובמאסטר - תיכנות ובניית אתרים
שאלות ותשובות:
הוסף תשובה

שאילתות איחוד - מי? למה? וכמה?



תגיות: SQL‏  /  JOIN‏  
הוסף תשובה  |  הוסף הערה
1 תשובות לשאלה זו
הוסף תשובה
http://www.webmaster.org.il/showArticle.asp?id=178

בכל אופן מה שקורה לך זה בעצם איחוד שאילתות ללא קשר מסויים.
אני מניח שאתה מבין את העניין של קשרי גומלין (ואם לא אז כנס למאמרים במדור SQL)
עכשיו שאתה יוצר את שאילתת ה-JOIN אתה שולף משתי טבלאות על בסיס השדות המקושרות בקשרי הגומלין.

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

עכשיו אני אציג לך שלושה מצבים של שליפה:
1. נגיד ואנחנו הגדרנו במסד (בחלק של אכיפת הקשרים) שלמאמר חייב להיות כותב מאמר שקיים בטבלת הכתבים ושמאמר צריך להשתייך לקטגוריה שקיימת בטבלת הקטגוריות אז בעצם אנחנו נצטרך לעשות שימוש ב-inner join  על שלושת הטבלאות כאשר אנחנו נשתמש בקינון JOIN:

SELECT ac.catName, ac.subject, w.writerName
FROM
(Articles a INNER JOIN Categories c ON a.catId=c.catId) ac
   INNER JOIN Writers w ON ac.writerId=w.writerId

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

2. במידה והגדרנו בחלק של אכיפת קשרי גומלין שאפשרי שבטבלת המאמרים יהיו מאמרים שלא יהיה להם כתב רשום במערכת. אז בעצם נצטרך לשלב בין Inner Join ל-Left Join או Right Join (שהם בעצם מחזירים null עבור כל ערך בטבלה הנגדית לאופרטור Left/Right  שלא נמצא מתאים לטבלה של האופרטור)
ואז בעצם השאילתא תיראה כך:

SELECT ac.catName, ac.subject, w.writerName
FROM
(Articles a INNER JOIN Categories c ON a.catId=c.catId) ac
LEFT JOIN Writers w ON ac.writerName=w.writerName

או:

SELECT ac.catName, ac.subject, w.writerName
FROM
Writers w RIGHT JOIN
(Articles a INNER JOIN Categories c ON a.catId=c.catId) ac
ON ac.writerName=w.writerName


הסינטקס שהשתמשתי בו זה הסינטקס שאני מכיר מאקסס
אני מניח שהוא דומה לזה של MySQL כי בכל זאת יש כאן את העניין של SQL ANSI
בכל אופן תבדוק ב-dev.mysql.com
ניר טייב, 5/1/2005
הוסף תשובה  |  הוסף הערה
הוסף תשובה לשאלה זו:




וובמאסטר © כל הזכויות שמורות