(פורסם לראשונה ב-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
לאלו שזוכרים משהו מתורת הקבוצות ודיאגראמות וֶן-השליפה הראשונה מחזירה את החלק הצבוע תכלת משמאל, השליפה השניה את החלק הצבוע תכלת מימין, וכמובן שאם לא חוזרות רשומות – הטבלאות זהות.
הערת הסתייגות: אני מניח שאין רשומות זהות בתוך הטבלאות עצמן, ושבכל טבלה הרשומות יחודיות.
על עוד שיטה חוץ SQL-ית להשוואת טבלאות, אפשר לקרוא כאן