עזרה בשאילתה

yoave23

New member
עזרה בשאילתה

יש לי 2 טבלאות (ראו מצ"ב) בבסיס הנתונים, הזמנות ופרטי הזמנה.
אני מנסה לבצע שאילתה שתחזיר לי רק את ההזמנות שאף אחת מפרטי ההזמנה שלהן לא מכילה 0 בעמודת ה - Quantity.
ז"א שבהינתן המידע הנ"ל יוחזרו לי רק ההזמנות שה - OrderId שלהן הוא 1 או 3.
ניסיתי לשחק עם כל סוגי ה - Join ועוד כל מיני דברים אך לא הצלחתי לקבל את התוצאה הרצויה.
תודה רבה.
 

yoave23

New member
לאחר נסיונות רבים הגעתי לזה

select OrderItems.OrderId
from OrderItems
group by OrderItems.OrderId
having MIN(OrderItems.Quantity) > 0


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

תודה רבה
 

AvidaEinav

New member
שים לב שאין צורך בלולאה פנימית

שלב ראשון: להביא את כל ההזמנות הבעיתיות.

שלב שני: להביא את כל ההזמנות שלא נמצאות בשאילתא שקבלנו
 
יכול להיות מעניין לבדוק איזה משלושת הגישות

שהוצעו כאן היא היעילה ביותר.

בכל אופן, גישת ה group by היא ללא ספק הקוד הפשוט ביותר, וגם לזה יש יתרונות.

מהנסיון שלי הגישה של not in יעילה פחות מהגישה של exists, אבל זה לא אמור להיות משמעותי במיוחד בנפחים קטנים.
 
וכמובן, אפשר גם עם left join פשוט:

SELECT OD1.OrderId
FROM TblOrderDetails OD1 LEFT JOIN
TblOrderDetails OD2 ON(OD1.OrderId = OD2 .OrderId AND
OD2.Quantity = 0)
WHERE OD2.OrderId IS NULL
 

AvidaEinav

New member
בבקשה 1

שים לב אין כמעט נתונים ואין אינדקסים בכלל!!!

לגבי ה NOT IN אתה צודק לחלוטין (מה גם שהוא לא החלטי לגבי NULLS וצריך להזהר שהטבלה הפנימית לא תחזיר אותם), במקרה הזה בדקתי שדות ספציפיים ולכן לא יכולתי להשתמש (בדרך שבחרתי) ב EXISTS.
 
מעניין. מהתמונה הזו עולה שבנפחים קטנים

דוקא ה not in היא הגישה היעילה יותר (רק 19% לעומת ה 20% של שתי הגישות האחרות שהעלתי ולעומת ה 42% מגישת ה group by).

כל הכבוד שטרחת לבנות את הטבלאות ולבדוק
 

AvidaEinav

New member
בבקשה 2

עם אינדקס
CREATE INDEX idx_1 ON #Ditailes (OrderId) INCLUDE (Quantity)

כנראה בגלל שיש קצת שורות הוא לא עושה INDEX SEEK ועושה INDEX SCAN.

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

yoave23

New member
תסלחו לי על הבורות אבל לא הבנתי...

אז האופציה הראשונה של שפיפון הים הסינגפורי (
) אינה מתאימה?
השאילתה שלי עם ה - group by מתאימה אך פחות יעילה?
אז מה שנשאר זאת השאילתה עם ה NOT IN?
אני לא כ"כ מבין את הסכמה שהעלתם שמראה את הביצועים.
 

AvidaEinav

New member
אז ככה

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

הכל פונקציה של אם אתה יכול לשים אינדקסים על שדות מסויימים או לא.
האם בכלל שווה לשים אינדקס מסויים על טבלה מבחינת עלות מול תועלת
וכו'.......

* קח בערבון מוגבל את הכל כי אין כמעט מידע בטבלאות, מחר אני אנסה להעמיס שורות ונראה מה יצא...
 
למעלה