שלח תשובה

זירת השאלות

348
צפיות
20
תשובות

פונקצית JOIN – זה פעם ראשונה שלי…

,‏ 3 במאי, 2004

היי,
היום אני מתחיל ללמוד על פונקצית JOIN שהיא מחברת בין 2 טבלאות במסד….

אבל היות וזו הפעם הראשונה שלי, אז יש לי בעיה…..

הינה תקשיבו,
פתחתי מסד נתונים רגיל והוספתי לו בחלק של r.open "" את זה:


r.open "select foruma.id, devek.id * from foruma, devek WHERE foruma.id = devek.id "


וקיבלתי את השגיאה הזו:


Microsoft JET Database Engine error ‘80040e14’

Syntax error (missing operator) in query expression ‘devek.id *’.

/bananai/forum/indexss.asp, line 90



ובבקשה, אל תכתבו לי ב-JS כי אני לא יודע תכנות עם JS, רק VB….
תודה!

תגיות:

20 תשובות

  1. תודה, אבל עוד שאלה….

    עכשיו זה עובד…
    אבל מה קורה כשאני רוצה לשלוף מהטבלה forumb את ID ?
    אני יודע שצריך לעשות פקודה אחרת, ולא r.fields("id")…

    איך עושים?

  2. ניר טייב הגיב:

    נותנים AS לאחד מהשדות (או לשניהם)


    select foruma.id AS fid, devek.id from foruma, devek WHERE foruma.id = devek.id

  3. או שאתה לא הבנת או שאני לא הבנתי..

    עשיתי את משפט הפתיחה שהילדה אמרה לי וזה פועל….

    אני עכשיו רק רוצה להציג את מה שיש בטבלאות…
    לדוגמה אני רוצה להציג מforumb את id ומ-devek אני רוצה subject

    ולא הבנתי בכלל את הAS הזה….

  4. ניר טייב הגיב:

    אתה קורא לדשה רגיל
    ALIAS
    יש מקרים שאנו לא יכולים לקרוא לשדה באופן רגיל:
    1. שימוש בפונקציות SQL בפסוקית ה-SELECT (כמו MAX, SUM, COUNא וכד’)
    2. שני שדות שיש להם אותו שם (כמו במקרה שלך)

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

    SELECT tbl1.id, tbl2.id AS t2id FROM tbl1, tbl2

    במקרה של פונקציית SQL בפסוקית ה-SELECT

    SELECT COUNT(tbl.id) AS cntId FROM tbl

    אפשר להשתמש גם ב-ALIAS כדי לשלוף מתוך שליפה (מעין VIEW ברמת ה-ASP ) ובכך נותנים לתת שאילתא מסוימת שם מסוים שיהיה שם של טבלה שממנו אנו שולפים
    חשוב לזכור
    ה-ALIAS של התת שאילתא יהיה השם של הטבלה ממנה אנו שולפים לכן כדאי לתת ל-ALIAS שם הגיוני


    SELECT tmpTable.id FROM (SELECT tbl.id, tbl.subject FROM tbl) AS tmpTable

  5. 2 שאלות – מקווה שלא מסובכות….

    האם ניתן גם לעשות את אותו הדבר רק במקום טבלאות אחרות דטא בייסים אחרים….

    זה אפשרי?

    וכשעיתי את ה-JOIN אז הכול בסדר אבל כששלפתי בטבלה שיש בה רק רשומה אחת ועברתי עלייה בלולאה היא פשוט חזרה על עצמה מספר פעמיים בעוד שהאחרים לא…..

    זה הקוד:


    <%
    set c=server.createobject("adodb.connection")
    c="provider=microsoft.jet.oledb.4.0; data source="& server.MapPath("foruma.mdb") &""
    set r=server.createobject("adodb.recordset")
    r.activeconnection=c
    r.open "select foruma.id, foruma.subject, devek.id, devek.subject FROM foruma, devek "
    %>
    <% do until r.EOF %>
    <%= r("devek.subject") %><br><br>
    <%= r("foruma.subject") %>

    <br><br>
    <%
    r.movenext
    loop
    %>

    תודה מראש

  6. אוריקס – לא להכניס ל-FAQ
    אני אהפוך את זה למאמר בשבת

  7. 1. לא באקסס
    2. כי חסרה לך פסוקית ה-WHERE שמאחדת בין הטבלאות.

  8. ניר טייב הגיב:

    נראה לי שזו ההודעה הראשונה בפורום
    שהפכה למאמר

    ותודה ילדה שמחתי לעזור לך אבי

  9. ניר טייב הגיב:

    וגם אמרתי לך
    שיש אותם שמות של שדות משתמשים ב-AS ולא קוראים להן כך


    r("foruma.subject")

    אלא ע"פ הכינוי שנתנו להם ב-AS

  10. אוריקס הגיב:

    ובשביל ה FAQ
    מה זה אינר ג’וין? זה נולד מהרעיון שבמסד נתונים לא צריכות להיות כפילויות, לדוגמא:
    יש לי טבלת פורום. עבור כל רשומה בטבלה [שמציינת הודעה, כמובן], אני רוצה לקבל את פרטי שולח ההודעה: שם, שם משפחה, מס’ יוזר וכו’… אז מה שבעצם אני צריך לעשות הוא לשמור בכל רשומה את פרטי השולח. לא חבל?
    במקום זה אני פשוט אציין את מספר שולח ההודעה בכל רשומה, ומשם אני אקשר את עצמי לטבלת משתמשים, שבה אוכל לקבל את פרטי השולח. כלומר: מנענו כפילות נתונים – אני שומר אותם פעם אחת ומקשר אליהם רק עם מספר שולח ההודעה…

    עד כאן ברור? יופי.
    אז איך זה קשור לאינר ג’וין – התשובה היא שאינר ג’וין מטפל בקטע הטכני: שאילתה ששולפת משתי טבלאות או אפילו יותר.
    התחביר הוא בערך כך:


    SELECT messages.userid, users.userid, users.name
    FROM massages INNER JOIN users
    ON (massages.userid=users.userid)

    מה שעשינו כאן זה בעצם צרפנו שתי טבלאות, ויצרנו כאילו רשומה אחת גדולה שבה שדות משתי הטבלאות. איך ידענו איזו רשומה לצרף לאיזו רשומה? לפי פסוקית ה ON: מתי שהשדה userid בטבלה users שווה לשדה userid בטבלה messages.

    עוד דבר קטן: אינר ג’וין מחזירה רק רשומות מתאימות משתי הטבלאות, אך אם יש רשומה שאין לה התאמה, כמו למשל הודעה שרשם משתמש אשר אינו רשום בפורום – הרשומה לא תוחזר.

    יש עוד סוגים של ג’וין כגון Outer Join (החזרת רשומות שאין להן התאמה מלאה), Self Join – צרוף טבלה אל עצמה, Full Outer Join – החזרת גם רשומות שאינן מתאימות וכו’…

  11. עוד שאלה

    יש לי 2 מסדי נתונים (של אקסס) ואני רוצה לעשות התאמה בינהם,
    כלומר, אני רוצה להגיד לו שבמסד 1 בתוך הטבלה foruma יש ID (אוטומטי) ובמסד 2 יש את forumb ותוך הטבלה הזו יש את IDX (אוטומטי) ופשוט תיקח את כול מי שיש לו (לדוגמה) את המספר 2 מה IDX (במסד 2) ומ-ID (במסד 1) ותצרף אותו אליהם, וקח אלה…

    נ.ב.
    אני לא רוצה להגדיר לו שיוציא לי רק את 2 אלה שגם יעשה ל-3 ול-4, בקיצור לכול המספרים…

    יש אפשרות כזו?

    נ.ב.
    אמרתי 2 מסדים שונים ולא 2 טבלאות שונות!
    שימו לב להבדל!!

  12. ניר טייב הגיב:

    לא נראה לי שזה אפשרי
    לפחות לא באקסס
    אבל למה 2 מסדי נתונים שאפשר לעשות מסד נתונים אחד עם כל הטבלאות שצריך זה נותן גמישות בעבודה

  13. אוריקס הגיב:

    אני לא זוכר איך מתחברים לשני מסדים
    בכל מקרה התחביר הוא משהו כזה:


    [db].[table].[field]

    לא יודע אם אפשר באקסס. ברגע שיש לך אפשרות כזאת השתמש ב Union.

  14. אוריקס הגיב:

    כמו שחשבתי
    בכל מקרה, כמו שניר כתב עדיף לאחד מסדים.

  15. תראה ניר…
    אני אסביר לך,
    כשבניתי את הפורום הראשון שלי אז בניתי אותו על 2 מסדים שונים…
    היום אני יודע שזה תעות, משום שהיה לי קשה מאוד לבנות חיפוש על 2 מסדים ביחד, אני לא יכול עכשיו להשתמש בפונקצית JOIN ועוד כל מיני…בקיצור זו הייתה תעות…

    רק שכחתי לומר שDB ראשון זה נושא ראשי
    וDB שני זה תגובות

    מכיוון שעכשיו אני רוצה לבנות פורום עץ
    אז יהיה לי קצת בעייתי לעשות זאת, אבל אין מה לעשות…
    צריך להסתדר עם מה שיש…

  16. ניר טייב הגיב:

    יש לך אפשרות לעשות import ממסד אחר
    לחצן ימני –> import

שלח תשובה