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

15/02/2011

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

Filed under: Uncategorized — תגיות: , , — גרי רשף @ 22:00

איזהו חכם? הלומד מכל אדם: אריאל ממקום עבודתי שאל אותי לגבי 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) אלא רק התאמות.

מודעות פרסומת

להגיב »

עדיין אין תגובות.

RSS feed for comments on this post. TrackBack URI

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

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

%d בלוגרים אהבו את זה: