יום שלישי, 6 ביולי 2010

JOIN לא שווה - רק דומה....

שלום רב,

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

תשובה:
נהוג לחשוב כי ביצוע Join בין שתי טבלאות הינן רק כאשר שתי העמודות בשתי הטבלאות זהות.
אז זהו שלא... :)
ניתן לשלב במשפט ה- join בעת החיבור בין העמודות - LIke.

לדוגמא:
נקים שתי טבלאות:

טבלה ראשונה תייצג שמות פרטיים של העובדים:

CREATE TABLE [dbo].[t_names](
[name] [nvarchar](50) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[t_names] ([name]) VALUES (N'itai')
INSERT [dbo].[t_names] ([name]) VALUES (N'ziki')
INSERT [dbo].[t_names] ([name]) VALUES (N'david')

הטבלה השנייה תייצג שמות מלאים של העובדים:

CREATE TABLE [dbo].[t_full_names](
[full_name] [nvarchar](50) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[t_full_names] ([full_name]) VALUES (N'itai binyamin')
INSERT [dbo].[t_full_names] ([full_name]) VALUES (N'zipi')
INSERT [dbo].[t_full_names] ([full_name]) VALUES (N'haya')
INSERT [dbo].[t_full_names] ([full_name]) VALUES (N'veracity group')

במידה ונריץ את המשפט השליפה הבא לא נקבל תשובות מהסיבה שהעמודות הינן שוות (למרות שהן זהות בחלקם...):
SELECT *
FROM t_names INNER JOIN
t_full_names ON t_names.name = t_full_names.full_name

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

SELECT *
FROM t_names INNER JOIN
t_full_names ON t_full_names.full_name like t_names.name+'%'

בהצלחה!

2 תגובות:

אנונימי אמר/ה...

יפה איתי למדתי משהו חדש
אבי זלוף

אנונימי אמר/ה...

אבי היקר,
כבוד הוא לי ;-)