חשבתי לתומי שאני יודע הכל על Left Join

15/02/2011

2 תגובות

איזהו חכם? הלומד מכל אדם: אריאל ממקום עבודתי שאל אותי לגבי Left Join, והופתעתי לגלות פינה שלא הייתי מודע לה- בזכותו.

דוגמה קצרה- ניצור טבלת עובדים וטבלת ישובים, ונכניס לתוכן נתונים:

Use tempdb;

Go

 

Create Table T_Ovdim(Oved Varchar(20) Primary Key,

                    Yishuv Int,

                    TaarihLeyda DateTime);

Go

 

Insert Into T_Ovdim Values('Anat',1,'19700101');

Insert Into T_Ovdim Values('Beni',1,'19750101');

Insert Into T_Ovdim Values('Carmel',3,'19800101');

Insert Into T_Ovdim Values('Dana',4,'19850101');

Insert Into T_Ovdim Values('Eran',5,'19900101');

Go

 

Create Table T_Yishuvim(Yishuv Int Primary Key,

                        ShemYishuv Varchar(20),

                        Mahoz Varchar(20));

Go

 

Insert Into T_Yishuvim Values(1,'Haifa','Zafon');

Insert Into T_Yishuvim Values(2,'Jerusalem','Mercaz');

Insert Into T_Yishuvim Values(3,'Nahariya','Zafon');

Insert Into T_Yishuvim Values(4,'Beer Sheva','Darom');

Go

 

Select * From T_Ovdim;

Select * From T_Yishuvim;

Go

clip_image002

כעת נריץ שלוש שליפות Left Join שונות של שתי הטבלאות:

Select *

From T_Ovdim O

Left Join T_Yishuvim Y

        On O.Yishuv=Y.Yishuv;

 

Select *

From T_Ovdim O

Left Join T_Yishuvim Y

        On O.Yishuv=Y.Yishuv

        And Y.Mahoz='Zafon';

 

Select *

From T_Ovdim O

Left Join T_Yishuvim Y

        On O.Yishuv=Y.Yishuv

        And O.TaarihLeyda>='19800101';

Go

clip_image004

השליפה הראשונה די ברורה וממחישה את הרעיון הבסיסי שמאחורי Left Join:

כל השורות מטבלת העובדים מוצגות,

ולצידן השורות המתאימות – אם יש – מטבלת ישובים.

שורות לא רלוונטיות מטבלת ישובים (ירושלים) אינן מוצגות,

ושורות מיותמות מטבלת העובדים (ערן) מוצגות.

השליפה השניה גם צפויה- Left Join למתקדמים: הוספתי תנאי ב-On על טבלת הישובים (רק מחוז צפון),

שוב מופיעות כל השורות מטבלת העובדים,

ולצידן השורות המתאימות מטבלת הישובים העונות על קריטריון המחוז.

ליד דנה לא מופיע הישוב באר שבע מכיוון שאינו ממחוז צפון.

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

לתרגול ולווידוא הבנת הנושא- בדקתי מה קורה אם מבצעים Full Join בין הטבלאות עם התנאים מהשליפות השניה והשלישית הנ"ל:

Select *

From T_Ovdim O

Full Join T_Yishuvim Y

        On O.Yishuv=Y.Yishuv

        And Y.Mahoz='Zafon'

        And O.TaarihLeyda>='19800101';

Go

clip_image006

בחמש השורות הראשונות מופיעים חמשת העובדים,

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

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

לסיכום: תנאי On בניגוד ל-Where אינו מסנן שורות ב-Outer Joins (כדוגמת Left, Right, Full) אלא רק התאמות.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

2 תגובות

  1. רון קליין23/02/2011 ב 17:10

    החכמתי גם אני. תודה!

    הגב
  2. אייל ה.27/02/2011 ב 12:03

    תודה 🙂

    הגב