בכל אופן מה שקורה לך זה בעצם איחוד שאילתות ללא קשר מסויים. אני מניח שאתה מבין את העניין של קשרי גומלין (ואם לא אז כנס למאמרים במדור 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
1 תשובות
בכל אופן מה שקורה לך זה בעצם איחוד שאילתות ללא קשר מסויים.
אני מניח שאתה מבין את העניין של קשרי גומלין (ואם לא אז כנס למאמרים במדור 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