left join לא עובד

yossin

New member
left join לא עובד

יש לי (אקסס) טבלאות אם ובת ואני רוצה שאילתה בה יוצגו כל רשומות האם וברשומות הבתיוצגו רק אם יש רשומה
בניתי בעזרת האשףאת השאילתה הבאה:
SELECT base_em.File_num, base_bat.nish_status
FROM base_em LEFT JOIN base_bat ON base_em.File_num = base_bat.File_num
WHERE (((base_bat.nish_status)=2))
ORDER BY base_em.File_num;


וזה לא מציג אתהרשומות של האם שאין לה רשומה מתאימה בבת רק את הרשומות הקיימות בשתי הטבלאות

ניסיתי להפוך את ה LEFT ל RIGHT או להגדיר JOIN ב SQL ונאדה, זה לא קורה...

רעיונות?
תודה
 

נתן.ל

New member
יש בעיה בהגדרת הwhere

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

הפתרון שלך הוא או לסנן בwhere מן הטבלה הראשונה בלבד,
או להוסיף את המשפט base_bat.nish_status)=2 אל הJOIN
 

yossin

New member
מצטער,לא הבנתי

ה- where שייך לטבלת הבת
אני לאמביןמה עלי להוסיף

אפשר הסבר למטומטמים?
 

pitoach

New member
ברגע שניסת להחליף LEFT JOIN ב RUGHT

JOIN הית אמור להגיע למסקנה שיותר נכון יהיה לפתוח מדריך ולבין את ההבדל ואת הסוגים השונים של JOIN שיש. זה לא הגיוני לבזבז את הזמן על ניסיונות בלי שיש בהם הגיון
ההתנהות של LEFT או של RIGHT הפוכות כמובן. באותה מידה למה לא ניסת להריץ פונקציה של LEFT, ברור כי פונקציה של LEFT לא קשורה ל LEFT JOIN... הרעיון שאני מנסה להסביר הוא שקודם צריך להבין ורק אז לנסות משהו שכבר יודעים מה אמור להגיע.

אז מה כן ?
בכל מקרה כל הבעיה שאני רואה היא שאתה מבצע סינון ולכן מקבל את התוצאות שמתאימות לסינון. ברור שאם אתה מבצע סינון רק של base_bat.nish_status ששווה ל 2 אז לא תקבל תוצאות בהן לא היה בכלל בנים מפני שה base_bat.nish_status שם הוא NULL

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


אני מקווה שזה יעזור
 

yossin

New member
קודם כל, תודה על הרצון הטוב

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

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

אני מצטער, לא באמת מבין את ה"נסה את זה"

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

אבל ממה שכתבתם כאן לא הבנתי איך לנסח את השאילתה אחרת

תודה
 

נתן.ל

New member
אנסה להסביר את זה מופשט יותר

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


SELECT base_em.File_num, base_bat.nish_status
FROM base_em LEFT JOIN base_bat ON (base_em.File_num = base_bat.File_num AND base_bat.nish_status=2)
ORDER BY base_em.File_num;
 

yossin

New member
נפלא

בדיוק הקוד שהייתי צריך (עכשיו אפשר להפוך אותו לדבר האמיתי)
אני חייב לךבקבוק יין- אל דאגה, ארוקן אותו קודם...
 

pitoach

New member
אתה צודק.. זו לא היתה הכוונה


* הפורום מיועד לכולם ולא רק ל"מיקצוענים" אלא ובעיקר לכאלה שרוצים ללמוד ולהפוך ל"מיקצוענים". אז תרגיש חופשי לשאול
אבל אתה צריך בסיס כלשהו לשאלות
ולכן אני ממליץ רגע לעצור ולעבור על מדריך בסיסי של SQL.

תלמיד בכיתה א שישאל אותך שאלה כמו "ביצעתי במחשבון חישוב של LOG לפי בסיס 3 של 233243 וקיבלתי תוצאה שונה מזו שיש בספר", כיצד תענה לו? אם הוא עדיין לא יודע מהיא פעולות חיבור/חיסור/כפל/חילוק אז כיצד תסביר לו היכן הבעיה אצלו? הפתרון הוא קודם ללמוד את הפעולות המקדימות כמובן.

בוא תנסה לעבור על כל המדריך הבא לעומק ותוך יומיים השקעה תוכל להבין הכל על שפת SQL (כן זה קורס של 40 שעות כולל תרגולים ופיטפוטים בקבוצה ולבד אפשר ללמוד את כל הבסיס ביומיים מלאים... סוף שבוע הקרוב למשל)
http://www.w3schools.com/sql/default.asp

** בשלב הבא תוכל לחזור לשאלה שלך ולראות שעשית שימוש בסינון בשאילתה שלך ולכן התוצאות סוננו ולא קיבלת את כל התוצאות של ה JOIN.

*** נקודה נוספת לגבי ה"נסה את זה" למרות שאני ממליץ לך להתחיל מלימוד שפת SQL לפני שאתה קורא את החלק הבא וקופץ לפיתרון. הכוונה היתה להריץ את השאילתה בלי סינון. כמובן אם אתה לא מבין מה זה סנון ולמה שמת סינון אז אין ברירה אלא ללמוד קודם אבל השאילתה בלי הסינון תהיה כך בערך

SELECT base_em.File_num, base_bat.nish_status
FROM base_em LEFT JOIN base_bat ON base_em.File_num = base_bat.File_num
ORDER BY base_em.File_num;


בשום אופן אל תמשיך לעבוד עם האשף אם אתה רוצה ללמוד משהו!
האשף נועד במפורש למי שלא רוצה ללמוד, ומחפש מישהו שיבצע עבורו את השאילתה. זה כמו להעסיק ילד שיבצע עבורך את העבודה. האשף גם לא יותר מהיר מכתיבה של שאילתה מפורשת והיכולות שלו מאוד מוגבלות. כל פעם שאתה עובד עם האשף אתה מבזז כמה דקות שיכולת ללמוד עוד פרק בשפת SQL
 

yossin

New member
תודה מקרב לב

שוב אני מגלה כמה שהאנשים טובים וכמה קל לקבל עזרה
(חכה תראה אתהתודה שלי לחבר שלך)
 

משקיען10

New member
pitoach

מה הכוונה שלך בזה שהסינון עובד על התוצאה של ה- JOIN? יש דרך אחרת לעשות את הסינון לפני ה- JOIN? אני שואל כי במקרה גם אני בניתי היום שאיתה של left join בין 2 טבלאות וקיבלתי תוצאה שונה מה שרציתי ולדעתי א יש דרך אחרת לעשות סינון אז פה נמצאת התשובה לבעיה שלי גם. אני אעלה DML ו- DML אם אני לא אסתדר מחר, בינתיים אני מנסה עוד קצת לחפור עד שאני אצליח או יתייאש (המוקדם מביניהם...)
 
למעלה