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

15/02/2011

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

שייך לקטגוריה: 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 של התגובות על הרשומה הזו טרקבאק קישור

כתיבת תגובה

Fill in your details below or click an icon to log in:

WordPress.com Logo

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

Twitter picture

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

Facebook photo

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

Connecting to %s

ערכת עיצוב: Shocking Blue Green. בלוג בוורדפרס.קום.

Follow

Get every new post delivered to your Inbox.

הצטרפו אל 25 שכבר עוקבים אחריו