עוד שאילתה פשוטה

noa 21

New member
עוד שאילתה פשוטה

יש לי שתי טבלאות (יחיד לרבים) טבלת הזמנות המכילה את העמודות: מספר הזמנה ותאריך הזמנה וטבלה של פריטים להזמנה המכילים, מספר פריט, מספר קטגורייה, מחיר אני רוצה להציג את כל ההזמנות במערכת וכן את מספר הקטגוריה של הפריט (הראשון בכל הזמנה). אני כותבת את השאילתה הבאה:
SELECT DISTINCT Orders.OrderID, OrderItems.CategoryID FROM Orders INNER JOIN OrderItems on OrderItems.OrderID=Orders.OrderID​
אך הזמנות בהם יש יותר מפריט אחד מוצגות מספר פעמים. איך אני יכולה לדאוג שכל הזמנה תופיע רק פעם אחת בכל מקרה (לא משנה כמה פריטים יש לה) אך עדיין יוצר מספר הקטגורייה של הפריט הראשון של כל הזמנה (אם יש לה פריטים) תודה
 

pitoach

New member
עדיין לא סגרת את השירשור הקודם נועה

לזכרוני זו השאלה משם או שאלה דומה מאוד?!? אם משהו בהסבר לא ברור דאי להמשיך את השירשור ולבקש הבהרה על ההסבר כדי לא להתחיל הכל מההתחלה. לא כך ? הסיבה מופיעות לך מספר רשומות למרות ה DISTINCT זה כי ה DISTINCT מופעל אצלך גם על ה Orders.OrderID כמו רצית אבל גם על ה OrderItems.CategoryID ולכן נוצרים לך רשומה אחת לכל קטגוריה לכל הזמנה הדרך הפשוטה ביותר היא עבודה עם שאילתה פנימית (כמו בבעיה הקודמת שלך), או בצורה יותר נכונה פשוט לא לבקש את הנתון של OrderItems.CategoryID שבכל מקרה מיותר מבחנתך, כך שתקבלי רק את רשימה של מספרי OrderID ייחודים (בלי חזרה) שעומדים בתנאי שלך כמה נקודות למחשבה: * למה לעבוד עם INNER ולא RIGHT לחיבור הטבלאות? האם יכול להיות מצב שיהיה נתון של מוצר שהוזמן בטבלת OrderItems שלא יהיה לו אח תואם בטבלת ההזמנות?!? * למה בכלל לבצע איזה שהוא JOIN כשכל הנתונים שאת צריכה נמצאים בטבלה אחת בלבד? את לא צריכה בכלל את הטבלה של Orders כי כל מה שמעניין אותך לפי האפיון בשאלה זה רק מספרי ה OrderID שנמצאים כמובן בטבלה של מוצרים שהוזמנו (JOIN היא פעולה מאוד יקרה במסדי נתונים = מבוסס על פעולה שנקראת במתמטיקה הכפלה קרטזית)
 

pitoach

New member
תיקון שגיאות הקלדה

עדיין לא סגרת את השירשור הקודם נועה‬ לזכרוני זו השאלה משם או שאלה דומה מאוד?!? אם משהו בהסבר לא ברור כדאי להמשיך את השרשור ולבקש הבהרה על ההסבר כדי לא להתחיל הכל מההתחלה. לא כך ? הסיבה שמופיעות לך מספר רשומות למרות ה DISTINCT זה כי ה DISTINCT מופעל אצלך גם על ה Orders.OrderID (כמו שרצית) אבל גם על ה OrderItems.CategoryID.ולכן נוצרים לך רשומה אחת לכל קטגוריה לכל הזמנה. הדרך הפשוטה ביותר היא עבודה עם שאילתה פנימית (כמו בבעיה הקודמת שלך), או בצורה יותר נכונה פשוט לא לבקש את הנתון של OrderItems.CategoryID שבכל מקרה מיותר מבחנתך, כך שתקבלי רק רשימה של מספרי OrderID ייחודים (בלי חזרה) שעומדים בתנאי שלך כמה נקודות למחשבה: * למה לעבוד עם INNER ולא RIGHT לחיבור הטבלאות? האם יכול להיות מצב שיהיה נתון של מוצר שהוזמן בטבלת OrderItems שלא יהיה לו אח תואם בטבלת ההזמנות?!? * למה בכלל לבצע איזה שהוא JOIN כשכל הנתונים שאת צריכה נמצאים בטבלה אחת בלבד? את לא צריכה בכלל את הטבלה של Orders כי כל מה שמעניין אותך לפי האפיון בשאלה זה רק מספרי ה OrderID שנמצאים כמובן בטבלה של מוצרים שהוזמנו (JOIN היא פעולה מאוד יקרה במסדי נתונים = מבוסס על פעולה שנקראת במתמטיקה הכפלה קרטזית)
 

noa 21

New member
אז ככה...

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

pitoach

New member
3 נקודות

1. סגירת שירשור הכוונה לשים הודעת "תודה הצלחתי" או "תודה לא הצלחתי" או "תודה מצאתי פתרון" או משהו שמציין שקראת את התגובה שקיבלת שם ולא סתצם רשמו אותה 2. מה שאת אומרת עכדיו שונה לחלוטין מהאפיון שלך במקור! לכן חשוב להעלות לפעמים יותר ממה שחושבים שרלוונטי אם אפשר
מה שאת רוצה עכשיו אפשר לבצע בקלות עם RANK נסי לקרוא מעט על הפונקציה RANK (בהנחה שאת עובדת בשרת SQL כמובן כי אני לא בטוח שהיא קיימת בשרתים אחרים). היא נוןעדה בדיוק למה שאת צריכה כרגע (את רוצה את המוצר עם ה RANK של 1 ז"א הראשון ברשימה) 3. LEFT ן RIGHT דיי זהים ותלויים בסדר של חיבור הטבלאות. בצורה שכתבת הרי שהטבלה עם הנתונים נמצאת בימין והטבלה עם הנתונים המיותרים (כל ה ID גם מי שאין לו בכלל הזמנות) נמצאת משמאל לכן את צריכה RIGHT אחרת תקבלי את כל הנתונים משמאל
 

noa 21

New member
לגבי 2

קראתי, לא בטוחה שהבנתי, בכל מקרה לא ראיתי איך זה פותר או קשור לבעיה שלי. תוכל להדגים על השאילתה שלי ?
SELECT DISTINCT Orders.OrderID, OrderItems.CategoryID FROM Orders INNER JOIN OrderItems on OrderItems.OrderID=Orders.OrderID​
תודה
 

noa 21

New member
כמו כן

ניסיתי לעשות שאילתה פנימית כמו שאמרת:
select distinct OrderID,(select top 1 OrderItems.CategoryID from OrderItems where OrderID=OR.OrderID) as tbl1 from Orders OR LEFT JOIN OrderItems on OR.OrderID=OrderItems.OrderID​
הבעיה היא שאם אני רוצה חוץ מ-CategoryID עוד שדה אחד מהטבלה הפנימית אני מקבלת הודעת שגיאה:
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS​
אז איך עושים את זה נכון ? תודה
 

pitoach

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

כמו שכתבת זה לא שדה בטבלה אלא טבלה שלמה שמחברים למשל עם JOIN אני אנסה לגעת בשאילתה לך מאוחר יותר אם אכנס שוב אבל בינתיים פשוט דוגמה קלה של שימוש בשאילתה פנימית כטבלה
select Tbl1.Feild1, Tbl2.Feild2 from Ybl1 left JOIN ( -- שאילתה פנימית שמייצרת את הטבלה select x as Feild2 from xxx ) as Tbls on Tbl1.Feild1 = Tbl2.Feild2​
בצורה שאת כתבת קיבלת הודע ה הגיונית שאומרת שלא ניתן לקבל בשדה יותר מערך אחד
אם השאילתה הפנימית היתה מחזירה תמיד (אבל תמיד) ערך אחד בדיוק אז היה אפשר להישתמש בערך זה כשדה שמחזירים בשאילתה הראשית. אבל זה לא המצב עליו דיברתי וכמובן בגלל שהשאילתה מחזירה מספר רשומות/שדות קיבלת הודעת שגיאה מוכרת
נסי לרשום שאילתה בהתאם
 

noa 21

New member
מצאתי באינטרנט

מקום בו דובר על כך ש- CROSS JOIN במקרה הזה הוא הכי נכון לביצוע. האם כך הדבר ?
 
למעלה