הבלוג של גרי רשף

22/03/2010

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

Filed under: Uncategorized — תגיות: — גרי רשף @ 21:49

(פורסם לראשונה ב-www.SqlServer.co.il)

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

Select *

From    MyTable_1

Except

Select *

From    MyTable_2

בהנחה שהסכימה של הטבלאות זהה- אין צורך לפרט ב-Select את שמות העמודות!

כעת נרצה לקבל באופן דומה את השורות שנמצאות בטבלה השניה אך לא בראשונה:

Select *

From    MyTable_2

Except

Select *

From    MyTable_1

וכדי לקבל את כל החריגים ביחד נאחד את שתי השליפות הנ"ל על ידי פקודת Union All, ונצרף לכל אחת עמודה שתציין את שם טבלת המקור:

Select 'MyTable_1' Tbl,

     *

From    (Select    *

    From    MyTable_1

    Except

    Select    *

    From    MyTable_2) T1

Union All

Select 'MyTable_2' Tbl,

    *

From    (Select    *

    From    MyTable_2

    Except

    Select    *

    From    MyTable_1) T2

clip_image0021_thumb

לאלו שזוכרים משהו מתורת הקבוצות ודיאגראמות וֶן-השליפה הראשונה מחזירה את החלק הצבוע תכלת משמאל, השליפה השניה את החלק הצבוע תכלת מימין, וכמובן שאם לא חוזרות רשומות – הטבלאות זהות.

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

על עוד שיטה חוץ SQL-ית להשוואת טבלאות, אפשר לקרוא כאן

יצירה של אתר חינמי או בלוג ב־WordPress.com.