לא מסתדרת עם שאילתה פשוטה

noa 21

New member
לא מסתדרת עם שאילתה פשוטה

יש לי טבלה של הזמנות ופריטים, אני בונה שאילתה (עם הרבה JOINS כי לשאילה יש הרבה אילוצים גם בהתאם לפריטים שהיא מכילה) שמחזירה לי את רשימת ההזמנות וכו' כדי לא להציג כמה פעמים הזמנות בהם יש מס' פריטים אני משתמשת ב-DISTICNT ORDERID. הבעיה היא כזו: יש לי שאילתה נוספת דומה מאוד לזו מבחינת כל ה-JOINS והתנאים רק שהיא אמורה לחשב סכום הזמנות ועוד כל מיני סיכומים באמצעות count ו-sum. העניין הוא שב-SUM היא בעצם מחשבת פעמיים את ההזמנות להם יש 2 פריטים... איך אני יכולה לשלב גם פה את עניין ה-DISTICT כך שהיא תישב כל הזמנה רק פעם אחת ? תודה
 

pitoach

New member
את X ולהעבי ליד Y ואז אולי את Z להעביר למטה

ליד K ואולי אם תעבירי שורה שלישית ליד שורה רביעית...ואם תעשי JOIN על כל הטבלה השלישית אצלי בשאילתה אז תוכלי לראות שהכל עובד טוב... נועה את צוחקת עלינו ?!? כיצד את רוצה שנעזור לך מקריאת מחשבות או מכניסה לשרת שלך כדי לראות את הקוד?!? את מספרת הרבה סיפורים על מה שיש לך. הצעה שלי... תצרפי לנו מה שאת מספרת ונשמח לעזור וגם נוכל לעזור
מצטער אם זה קצת בוטה אבל כל כמה ימים מישהו חושב שאנשים בפורום הם קוראי מחשבות. כבר ראיתי הודעות בסגנון: "יש לי הודעת שגיאה. מה לעשות?" כמובן בלי שצירפו את הודעות השגיאה... תמיד יש לצרך כל מה שיש לך שקשור לשאלה (שאילתות, הודעות שגיאה, קודים, תוכנה רלוונטית וכו'). תעזרו לנו לעזור לכם
* הערה במקרה של שאילתות מומלץ לצרף תבנית מלאה של מסד הנתונים (הטבלאות הרלוונטיות) נועה... חיזרי עם נתונים כדי שנוכל לעזור (דרך אגב יש פורום מיוחד למסדי נתונים בו יש יותר אנשי מקצוע בתחום SQL אני מניח)
 

noa 21

New member
או קיי שים לב

יש לי 2 טבלאות, טבלת הזמנות וטבלת פריטים להזמנה (לכל הזמנה יכול להיות יותר מפריט אחד) השאילתה שאני מנסה להריץ היא:
SELECT distinct [OrderID] from Orders INNER JOIN OrderItems on Orders.OrderID=OrderItems.OrderID where OrderID=1111 SELECT distinct SUM(Orders.Amount) from Orders INNER JOIN OrderItems on Orders.OrderID=OrderItems.OrderID where OrderID=1111​
כאשר לצורך להזמנה 1111 יש יותר מפריט אחד. השאילתה הראשונה מחזירה רק רשומה אחת כי השתמשתי ב- distinct לעומת זאת הרשומה השניה שאמורה להחזיר לי את סכום כל ההזמנות שעונות על התנאי בשאילתה, מחשבת את סכום ההזמנה של כל הזמנה כמספר הפריטים שבה ולכן סכום ההזמנה הזו ייספר מספר פעמים במקום פעם אחת. מה אני יכולה לעשות ? איך גם פה אני מממשת את עניין ה-distinct בחישוב סכום ? תודה
 

pitoach

New member
זה זמן טוב לעבור על נושא שאילתות פשוטות ../images/Emo13.gif

השאילתה הראשונה רשומה כל כך מוזר ולא ברור לי לכן מה התכוון המשורר השאילתה מחזירה ערך אחד כי את רושת תנאי שמחזיר רק ערך אחד where OrderID=1111 ואת בוחרת רק את הנתון של OrderID אם תורידי את את ה Distinc אולי יחזרו כמה נתונים בגלל הפיצול שמייצר ה JOIN אבל למה בכלל עבדת עם JOIN אם את רוצה רק להחזיר נתון אחד ?!? מה המשמעות של ה JOIN כאן ?!? השאילתה הבאה תחזיר אותו ערך כמו השאילתה שלך select 11111 את אומרת שיש תמיד יותר מהזמנה אחת. אין בכלצ שום צורך לגשת לנתונים כי את מחזירה את הערך שכבר ידוע לך מראש ובטח שלא לעשותך JOIN בשאילתה השניה את מחזירה distinct על תוצאת הסיכום ולכן אם יש 2 נתונים עם אותה תוצאת סיכום הם לא יחזרו בכלל אלא רק אחד מהם נעבור לניחוש של מה שאת רוצה לפי מה שיש לנו עד כה: עקרונית צריכות להיות לך 3 טבלאות (לא יכול להיות 2 אלא אם האפיון ממש ממש רע). צריך להיות לך יחס של רבים לרבים. כל הזמנה יכולה להיות של כמה מוצרים וכל מוצר יכול להופיע בכמה הזמנות. - טבלה של הזמנות (שדה מספר הזמנה) - טבלה של פריטים שהוזמנו (שדה מספר הזמנה, שדה מספר פריט שהוזמן). זו היא בטלה מקשרת ביחס רבים לרבים. - טבלה שלישית היא טבלה של פריטים (שדה ייחודי של מספר פריט, שדה של שם הפריט, וכאן אמור להיות שדה הנתון של מחיר הפריט!) * יכול להיות שוויתרת על טבלה שלישית ואת עובדת עם שמות הפריטים בצורה קשיחה. זו דרך גרועה אבל אפשרית... 2 הטבלאות הראשונות מחוברות בשדה מפתח ראשי "מספר הזמנה" בטבלת ההזמנות, ומפתח מקשר חיצוני בטבלה השניה באותו שם ז"א עד כאן יש לנו מצב פשוט של יחס יחיד לרבים בין טבלת הזמנות לטבלת הפריטים המוזמנים (כל הזמנה יכולה להכיל כמה פריטים) עתה את רוצה בשאילתה ראשונה לקבל את ____מצטער.. לא מצליח לנחש אפילו_____ בשאילתה השנייה את מנסה כניראה לקבל את סך כל הסכומים של כל ההזמנות. אבל לפי מה שרמת בשאילתה הסכום מופיע בטבלת ההזמנה ולא בטבלה של הפריטים (מוזר מאוד ואני לא מצליח להבין את האפיון שלך בכלל אבל). אם זה המצב אז לשם מה את צריכה את ה JOIN בכלל ?!? כל הנתונים שאת מוציאה נמצאים באותה טבלה, כל התנאים על אותה טבלה. מה בדיוק את צריכה מהטבלה השניה ?!? מה המבנה הטבלאי שלך ? מה המבנה המלא שלך תעבירי לנו שאילתה לייצר טבלאות כמו שלך אם את יכולה ואם לא תרשמי מבנה טבלאות מלא ומבנה אפיון של הבעיה שלך. מה הקשרים בין הטבלאות? האפיון שלך לא ברור לי בכלל כרגע והשאילתות לחלוטין לא הגיוניות כולל הראשונה שאמרת שעובדת...
 

noa 21

New member
חבל שאתה מנסה לחשוב רחוק ...

למה אני עושה JOIN לא מעניין פה וכך גם מה מבנה שאר ה-DB ואם האפיון גרוע או לא. האמן לי זה DB עם 30 טבלאות ואתה לא רוצה שאני יתחיל להסביר את כל המבנה שלו ולכן צמצמתי למינימום האפשרי. זה לא יתרום להצגת הבעיה. להפיך. ניסיתי להמחיש תוך שימוש במינימום פרטים מיותרים. אני ימחיש גם במילים. ישנה טבלת הזמנות (שלצורך העניין כוללת מס' הזמנה, תאריך הזמנה וסכום כולל של ההזמנה) ישנה טבלת פריטים להזמנה (שלצורך העניין כוללת שם מוצר ומקט, בפועל זה ממש לא כך אבל זה לא משנה) בשאילתה הראשונה והשניה אני צריכה JOIN בין שניהם כי חלק מהתנאים של השאילתה קשורים לשתי הטבלאות, כגון: תציג את כל ההזמנות שאחד הפריטים שלהם הוא כדור. (תתעלם מזה שבסוף נתתי מספר הזמנה ספציפי) - השאילתה הזו עובדת מצויין כי היא לא מחזירה רשומות כפןלןת כי השתמשתי ב-DISTINCT ולכן אם הזמנה מסויימת מכילה כמה פריטים, למרות ה-JOIN לטבלת פריטים, תחזור רק רשומה אחת עבור כל הזמנה. בשאילתה השניה לעומת זאת, נניח ואני רוצה לעשות סיכום של כל ההזמנות שאחד הפריטים שלהם הוא כדור. אז אני עושה SUM על שדה סכום ההזמנה מטבלת הזמנות ועושה JOIN לטבלת פריטים להזמנה ובודקת האם אחד הפריטים הוא כדור. הבעיה בשאילתה כזו שהיא שמכיוון שאין שימוש ב-DISTINCT במידה ובהזמנה מסויימת יש יותר מפריט אחד היא תחזיר את אותה הזמנה יותר מפעם אחת (וכך גם תסכם את סכום ההזמנה יותר מפעם אחת עבור אותה הזמנה ) במקום לסכום כל הזמנה פעם אחת בלבד. זו הבעיה, ואת זה אני מנסה לפתור. איך אני משלבת את עניין ה-DISTINCT גם כשאני משתמשת ב-SUM ? תודה.
 

pitoach

New member
כמו שכתבתי מעל את הייחודיות את מפעילה על

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

noa 21

New member
אפשר לעשות הכל בשאילתה אחת ?

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

pitoach

New member
דוגמה להחזרת מספר פרמטרים משאילתה פנימית ?

select x from ( select x from TableName ) as Tbl המקרה מעל כמובן אבסורדי כי אני לוקח בשאילתה פנימית את כל הנתונים ושוב לוקח את כל הנתוןנים מהתוצאה... אבל זו דוגמה טובה הכי פשוטה להצגה של הנושא * שימי לב שאם לוקחים נתונים מתוך תוצאות של נתונים כמו במקרה מעל יש לרשום "שם טבלה וירטואלי" כמו שבחרתי Tbl בלי זה תקבלי הודעת שגיאה * עוד משפט הסברון: הרעיון הוא שבסוגריים יש שאילתה כלשהיא שמחזירה תוצאות. אל התוצאות אנחנו מתייחסים כאל טבלה לכל דבר (כאשר נתנו לה שם וירטואלי כמו שאמרתי). אפשר לבצע שאילתות מורכבות בתוך הסוגריים וכמובן מחוץ לסוגריים על התוצאות
 
למעלה