Saturday, December 13, 2008

בניית תת-שאילתא קוארלטיבית ב - Designer

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

אולם אם נרצה לשלוף עבור כל לקוח את התאריך הנוכחי בכדי לאפשר להסתכל על מצבו העכשווי נצטרך להשתמש בתת-שאילתא קוארלטיבית אותה נוכל לשלב כתנאי בעולם.
תת-שאילתא קוארלטיבית היא תת-שאילתא מיוחדת שקרויה גם repeating sub query.
למה ? מאחר והיא חוזרת על עצמה.בדוגמא שלפנינו תת - השאילתא מחזירה עבור כל לקוח את התאריך האחרון שלו .תת-השאילתא סורקת את רשומות הלקוח מוצאת את התאריך הנוכחי שלו ועוברת ללקוח הבא,מוצאת את התאריך המקסימלי שלו וכך הלאה,עד שהיא מסיימת לעבור על כלל הלקוחות.

על מנת לאפשר את ה"לופיות" הזו אנו בונים alias כנגד טבלת הלקוחות בכדי לאפשר את ההשוואה החוזרת הזו (קוראלצייה...) של כל לקוח ולקוח.
קוראלציית ה- alias מתרחשת on the fly ונשבץ אותה בפסוקית ה- From כתנאי בעולם.

טבלת ה – s1 היא טבלת ה-alias ואנו מביאים את השורה הנוכחית (המקסימלית...) ע"י שימוש בפונקציית ה-max על שדה ה- invoice_date :

Sales.invoice_date = (select max ( s1.invoice_date )
from sales s1
(where s1.cust_id = Sales.cust_id

התוצאה:לכל לקוח מוחזר תאריך הקנייה האחרון:

יש לקחת בחשבון: מאחר ותהליך ביצוע התת-השאילתא הקוראלטיבית יכול להיות יקר במשאבים מאחר והוא חוזר על עצמו שוב ושוב יש לבחון במקרה הצורך שיפור ביצועים ע"י שימוש ב- partitions או index כאשר צריך לבדוק מה הפתרון המתאים ביותר שיציע ה- DBA או ע"י אנליזה עצמאית שתערכו על השאילתא.

No comments:

Post a Comment