השוואה בין טבלאות

22/03/2010

(פורסם לראשונה ב-www.SqlServer.co.il) לעתים יש צורך לבדוק אם שתי טבלאות זהות, ואולי אף למצוא את הרשומות החריגות, למשל: 1. יש לנו העתק או גיבוי של הטבלה מלפני מספר ימים ואנחנו רוצים לבדוק אם יש הבדלים בינהן. 2. ביצענו העברה מסביבת הפיתוח לסביבת הייצור ואנחנו רוצים לוודא שטבלת הפרמטרים זהה, או שהסכמות זהות (השוואה בין טבלאות מערכת). המשימה שנראית לכאורה די פשוטה במבט ראשון, יכולה להסתבך אם לא פועלים נכון כשמנסים להתמודד עם טבלאות מרובות עמודות. הדרך לעשות זאת היא על ידי "חיסור" טבלאות באמצעות פקודת Except (באוראקל משתמשים ב-Minus), פעולה שמחזירה את כל השורות שנמצאות בטבלה אחת ולא בשניה: Select * From MyTable_1 Except Select...
אין תגובות

יום π שמח

15/03/2010

אתמול (ארבעה עשר במרץ ציינו את יום ה-π הבינלאומי. לרגל המאורע- שתי וריאציות למציאת שני השלמים שהמנה שלהם מהווה הקירוב הטוב ביותר ל-π (שהוא כידוע מספר לא רציונלי) מבין המספרים עד 1000. בשני המקרים מחלקים את כל אחד מהמספרים ב-π, מעגלים את התוצאה, ומחלקים את המספר מחדש – אך הפעם בעיגול הנ"ל, ולסיכום – מוצאים את ההפרש בערך מוחלט מ-π. השיטה הראשונה האלגנטית יותר- כל שורה מושווית לקודמת וגוררת את הפרמטרים שמחזירים את התוצאה היותר טובה מבין השתיים, ולבסוף רק השורה האחרונה מוצגת: Declare @N Int; Set @N=1000; With Nm As (Select 0 N, ...
אין תגובות

היכן הפסיק ה-n-י? (מציאת מופע של תת מחרוזת)

12/03/2010

(פורסם לראשונה ב-www.SqlServer.co.il) נתונה לנו מחרוזת עם מספר ארצות-'Israel,England,Argentina,India,Kenya,Australia'. מה המדינה השלישית ברשימה? למצוא את הראשונה על ידי T-SQL קל- בעזרת פונקצית CharIndex נמצא את הפסיק הראשון, וכל מה שלפניו זו המדינה הראשונה: Declare @S VarChar(Max)= 'Israel,England,Argentina,India,Kenya,Australia', @I Int; Set @I=CHARINDEX(',',@S); Select SubString(@S,1,@I-1) FirstCountry; אבל כדי למצוא את המדינה השלישית יש להתחיל לחפש את השני בעזרת CharIndex לאחר הראשון, ואת השלישי לאחר השני, והמדינה היא תת המחרוזת שבין השני לשלישי.. מסובך: Declare @S VarChar(Max)= 'Israel,England,Argentina,India,Kenya,Australia', @I1 Int, ...
אין תגובות

כיצד פותרים בעיות סודוקו?

09/03/2010

חובבי הסודוקו מתחילים את הפתרון בסריקה של השורות, העמודות, והריבועים; תוך חיפוש מספרים שיכולים להופיע רק בתא מסויים. נתבונן למשל כאן: בתור התחלה ברור שאם בשורה העליונה מופיעים כבר המספרים 8,9,2,7,4,1 – הם לא יופיעו בתאים אחרים באותה שורה, וכלל זה תקף גם לגבי עמודות וריבועים. כלל מספר 1: אם יש מספר שמופיע במשבצת מסויימת, הוא לא יופיע במשבצות אחרות באותו שורה/עמודה/ריבוע. הלאה- אפשר לראות שבמשבצת השלישית בשורה השלישית (הפינה הימנית התחתונה של הריבוע השמאלי העליון) יופיע המספר 1: בשורה הראשונה כבר יש 1, בשורה השניה כבר יש 1, בשורה השלישית הוא יכול להופיע רק במשבצת שציינתי כי בעמודה השמאלית ובשני הריבועים הימניים העליונים...
אין תגובות

כיצד אין פותרים בעיות סודוקו

05/03/2010

יש DBA-ים שכל כך עסוקים לשחק Solitaire במחשב, עד שלא נותר להם זמן לדברים חשובים באמת כמו לפתור את הסודוקו בעתון.. בשביל זה אנחנו כאן וננסה למצוא דרך לעשות זאת בעזרת SQL, ולהוריד כך מעט מהעומס המוטל על אנשי המקצוע! נתחיל בדרך מעט נאיבית- ניתן למחשב לבדוק את כל האפשרויות: שיעבוד קשה בשעה שאנחנו עסוקים בדברים אחרים. השיטה באופן כללי תהיה כך: 1. ניצור טבלת עזר ובה !9 האפשרויות לכתוב את המספרים 1..9. 2. נעשה Join של טבלה זו עם עצמה 27 פעמים (9...
אין תגובות