en-UShe-IL
You are here:   Blog
Register   |  Login

Blog Archive:

Maximize
* Can be used in order to search for older blogs Entries

Search in blogs


Blog Categories:

Maximize
* Can be used in order to search for blogs Entries by Categories

Blog Tags:

Maximize
* Can be used in order to search for blogs by keywords

TNWikiSummit


Awared MVP

 


Microsoft® Community Contributor 


Microsoft® Community Contributor


 Read this before you use the blog! Maximize

Recent Entries

Minimize
יול15

Written by: ronen ariely
15/07/2022 10:22 RssIcon

הקדמה

אני כותב את הפוסט הזה בעקבות השאלה "מה ההבדל בין JOIN ל-UNION", אשר עלתה באחת הקבוצות הגדולות והמובילות בתחום Data Analytics בקישור זה.

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

אני מעדיף לכתוב כאן את התשובה מכיוון שהממשק של פייסבוק לא מתאים לדיון טכני או לכתיבה של הודעה ארוכה. לא אחת ולמעשה בדרך כלל כאשר אני כותב הודעה ארוכה בפייסבוק אז אני מקבל הודעת שגיאה בשלב זה או אחר של הכתיבה ומאבד את כל המידע. לגבי כמות הבאגים שיש בפייסבוק ועליבות הממשק וחוסר השירות נוכל לדבר בפעם אחרת. בואו נקפוץ לתגובה.

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

המילה JOIN היא חיבור.

המילה UNION היא איחוד.

ההסבר המדוייק של ההבדל בין הפעולות במסד הנתונים הוא פשוט התרגום לעברית המופיע בשורות מעל. אם אתם רוצים להבין את ההבדל בין JOIN לבין UNION אז אתם צריכים פשוט להבין את ההבדל בשפה העברית עם המילים חיבור לאיחוד. חיבור ואיחוד הם כמובן לא זהים. הדומה בין הפעולות הוא בכך שבשני המקרים אנחנו לוקחים יישות אחת או יותר ובונים יישות משולבת אחת על ידי ביצוע הפעולה. ההדל הוא בפעולה של השילוב.

שגיאות נפוצות

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

(1) "בג'וין אתה משתמש כדי לחבר טבלאות שונות"

חיבור ממש לא חייב להיות בין טבלאות שונות!

מאוד נפוץ לבצע פעולה חיבור מתמטי של 1+1 וגם מאוד נפוץ לבצע פעולה של Join בין טבלה לבין עצמה. יש לזה אפילו שם רשמי מקובל Self Join.

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

(2) "ביוניון אתה משתמש כדי לחבר טבלאות עם מידע זהה"

תחילה נזכיר שבאיחוד (UNION) אתה לא מחבר שום דבר אלא מאחד נתונים. פרט לכך, הטבלאות ממש אבל ממש לא חייבות להיות עם מידע זהה. למעשה בדרך כלל אין להן מידע זהה - אחרת למה צריך את 2 הטבלאות. אני מניח שהכוונה היתה להגיד שלטבלאות צריך להיות מבנה זהה.

גם זה לא מדויק מכיוון שגם חיבור וגם איחוד מבוצעים בין SET של נתונים ולא בהכרח בין טבלאות. אפשר למשל להריץ שאילתות משנה מורכבות על טבלאות שונות ואת התוצאה של מספר שאילתות משנה לאחד או לחבר לשאילתה משולבת אחת מורכבת.

פרט לכך, שאפשר גם לאחד SET של נתונים שאין להם מבנה זהה. למשל סוגים שונים של דטא ניתן לאחד או לחבר בהתאם לחוקיות של השרת.

כתבתי כמה דוגמאות וערכתי דיון קצר בדיוק בנושא זה ברשומה הבאה שלי בבלוג זה:

using union queries that return different field type

מאוד מומלץ לעבור על הקישור מעל לפני שממשיכים מכיוון שאני לא רוצה לחזור על עצמי!

(3) בunion מתבצע חיבור של שתי טבלאות שיש להן אותה סכמה

כפי שהסברתי מעל, אנחנו משלבים SETs של נתונים ולא טבלאות. שימו לב שניתן גם לאחד סטים עם סכמה שונה.

(4) בפול גוין הטבלה תכיל את העמודות של שתי הטבלאות ויתבצע חיבור בתנאי ה join. ישמרו כל השורות משתי הטבלאות

יש לי הרגשה שהכוונה כאן היתה ל UNION ולא ל JOIN והטענה היא לגבי UNION ALL.

בכל מקרה, שילוב של חיבור (JOIN) בדרך כלל לא משמר את הרשומות מהסטים שמחברים, אלא יוצר סט עם מבנה שורות שונה. 

אם לסטים אשר משלבים בעזרת איחוד (UNION) יש מבנה זהה (שזה לא חובה כי שהסברתי מעל) ורק אם אנחנו לא מבצעים שום פעולה על המידע בעמודות, אז התוצאה משמרת את המבנה ושומרת את המידע מרשומות המקור ומאחדת אותם לסט משולב.

(5) משתמשים ב join כדי לקבל מידע משתי הטבלאות באותה שורה, וב union כדי לקבל את כל השורות משתי הטבלאות כך שכל שורה תשאר ללא שינוי

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

אם נתעלם לרגע מנושא הביצועים, אז כל מה שאנחנו יכולים לבצע בעזרת JOIN מבחינת ה Result SET אשר חוזר מהשאילתה, אפשר גם לבצע בעזרת UNION והפוך... כל מה Result SET אשר אנחנו מקבלים בעזרת UNION אפשר לקבל בעזרת JOIN. זה לא משהו מומלץ בשרתים חיים מבחינת ביצועים בדרך כלל, אבל זה בהחלט סותר את הטענה מעל.

כתבתי פעם מאמר בנושא שאילתות משוגעות (לא לשימוש production) בו ניתן לראות כמה דוגמאות למשחקים כאלה:

Crazy TSQL Queries play time, by Ronen Ariely

לסיכום

התשובה הקצרה לשאלה מה ההבדל בין JOIN לבין UNION היא ש JOIN מחבר נתונים ו UNION מאחד נתונים.

אני מקווה שהבלוג מעט עוזר לסדר את המחשבה בנושא זה.