מחיקת שורה בטבלה שמופנה אליה FK

21/04/2015

נניח שאנחנו רוצים למחוק שורה מטבלת ההזמנות. הבעייה הצפוייה היא שטבלת שורות ההזמנה מקושרת אליה ביחס של 1:N (אחת לרבים), ולכן יש למחוק קודם כל את שורות ההזמנה ורק לאחר מכן את ההזמנה עצמה.לעיתים העסק עלול להסתבך: יש טבלת עובדים, הרבה מאוד טבלאות הכוללות קוד עובד מקושרות אליה, ולעיתים הן עצמן מהוות צד ה-1 לאיזה יחס FK וכך הלאה.. בקיצור- כבר מריחים רקורסיה באוויר!הפרוצדורה שלהלן פועלת כדלקמן: מפעילים אותה עם שם טבלה (סכימה + שם) וקוד מפתח למחיקה.מראש אני מבהיר שאני מניח באופטימיות שהמפתח הוא על עמודה אחת בלבד בכל הטבלאות המעורבות. הפרוצדורה יוצרת טבלה זמנית T# שתשמש...
תגובה אחת

סקריפט הפונה למספר דטבייסים

20/04/2015

לכאורה זו אינה משימה מסובכת במיוחד: בסקריפט הפונה למספר דטבייסים ניתן להוסיף למשפטי ה-SQL את שם הדטבייס (נניח-.. Update MyDB..MyTbl Set).כל זה לכאורה, כי יש מספר בעייות עם זה: סקריפטים רגישים (למשל- בהעברה מסביבת פיתוח לסביבה יצורית) אמורים להיות כתובים כך שאם יש תקלה ניתן להריצם שוב, והם ישלימו את החסר מבלי לפגוע במה שאינו. למשל- לא ינסו ליצור מחדש אובייקט שכבר נוצר, או להוסיף לטבלה שורות שכבר התווספו. לא ניתן לבצע פקודות Drop & Create לאובייקטים בדטבייס אחר מהנוכחי. ניתן רק בזה בו נמצאים. כלומר- לא ניתן להריץ פקודות בסגנון של ..Create Proc AnotherDB..P_MyProc As. אם כך,...
אין תגובות

טורניר ליגה – כולם נגד כולם

11/04/2015

קצת TSQL וקצת מתימטיקה: יש לנו ליגה בת 14 קבוצות, ואנחנו רוצים להכין תוכנית משחקים בת 14-1=13 סיבובים, בה בכל סיבוב מתקיימים 14/2=7 משחקים, כל קבוצה משחקת משחק אחד בכל סיבוב, וכל קבוצה משחקת פעם אחת נגד כל כל קבוצה אחרת במהלך כל הטורניר.למשל- טבלת ליגת העל נכון למועד כתיבת שורות אלו (מה שחשוב מבחינתנו אינו סדר הקבוצות אלא רשימת הקבוצות, כלומר- טבלה במשמעותה ה-SQL-ית): Create Table #T(ID Int Primary Key Clustered, Name NVarchar(20)); InsertInto #TValues ...
אין תגובות

Semi Join

08/04/2015

Semi Join (לרוב – Left Semi Join) הוא אופרטור לוגי בו לכל שורה מצד אחד בודקים אם יש התאמות בצד השני. משהו בסגנון של- Select *From AWhere Exists (Select * From B Where B.ID=A.ID); Select *From AWhere ID...
תגיות: , ,
אין תגובות

מציאת שתי שורות: לפני ואחרי נקודה נתונה

04/04/2015

נתונה טבלה, נקודה מסויימת (תאריך, ערך כספי..), וצריך למצוא את השורה שלפניה ואת השורה שאחריה.למשל- יש טבלה ובה עמודת תאריכים, וצריך למצוא את התאריך שלפני 01/04/2015 והתאריך שאחרי 01/04/2015. במקרה זה- 25/03/2015, 02/04/2015.כיצד נעשה זאת באופן כללי? מכיוון שמדובר בשתי השורות הראשונות בכפוף לתנאי כלשהו, האפשרות הראשונה העולה בדעתנו היא שימוש באופרטור Top, אלא שלא ברור מהיכן להתחיל לחפש: אין מדובר בשני הראשונים החל מ-01/04/2015, אלא החל מהתאריך שלפני.. אם כך, שתי הצעות ישומיות: נמצא את הראשון אחרי (בסדר עולה) וניעזר ב-Lag כדי למצוא את הקודם. נמצא את התאריך הראשון לפני (בסדר יורד), ובעזרתו את שני...
אין תגובות

חלוקת גרף לתחומים כהכנה לניתוח טכני

01/04/2015

בניתוח טכני של התנהגות מניות או ניירות ערך מקובל להתבסס בין היתר על נקודות קיצון בגרף, שינויי מגמה וכו’. אינני מתמצא בתחום הזה, אבל אנחנו אנשי בסיסי הנתונים נותנים שירות למערכות מידע בכל התחומים, אז בואו ננסה את כוחנו..ניצור טבלה שמדמה שערי ניירות ערך לאורך תקופה ארוכה, וננסה למפות בה את כל הנקודות המעניינות: נקודות מינימום נקודות מקסימום עליות ירידות מישורים: מינימום (לפני ירידה ואחרי עליה) מקסימום (לפני עליה ואחרי ירידה) כתף עולה (לפני ואחרי עליה) כתף יורדת (לפני ואחרי ירידה) לצורך ההמחשה- הגרף של נייר ערך 1028 בחודש ינואר 1980: בירוק- מקסימום בצורה של...
אין תגובות