יחס של רבים לרבים ללא טבלת עזר

06/01/2010

אין תגובות

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

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

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

Create Table #T_Yamim(Yom Int,Shem VarChar(Max))
Insert Into #T_Yamim Select 1,'א'
Insert Into #T_Yamim Select 2,'ב'
Insert Into #T_Yamim Select 3,'ג'
Insert Into #T_Yamim Select 4,'ד'
Insert Into #T_Yamim Select 5,'ה'
Insert Into #T_Yamim Select 6,'ו'
Insert Into #T_Yamim Select 7,'ש'

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

Create Table #T_Mosadot(Shem VarChar(Max),Yamim VarChar(Max))

Insert Into #T_Mosadot Select 'בית א','ב,ג,ש'

Insert Into #T_Mosadot Select 'בית ב','ג,ה'

Insert Into #T_Mosadot Select 'בית ג','א'

Insert Into #T_Mosadot Select 'בית ד','א,ב,ג,ד,ה,ו,ש'

Insert Into #T_Mosadot Select 'בית ה',"

מתנצל על התצוגה המשובשת בעברית..
את המידע נשלוף כך:

Select *

From #T_Mosadot M

Left Join #T_Yamim Y

On ','+M.Yamim+',' Like '%,'+Y.Shem+',%'

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

פתרון אחר שיכול להתאים לרשימות קצרות (כמו רשימת ימי השבוע למשל) הוא לציין בטבלת המוסדות מספר עשרוני שמייצג מספר בינארי בן 7 ספרות לכל היותר (0-127) כך שהספרה הראשונה מציינת אם הוא פתוח ביום א' (1) או לא (0), השניה מייצגת את יום ב' וכך הלאה.
בבית א' למשל נכתוב 70 שבבינארית הוא 10000110  ועל פיו המוסד פתוח בימים ב,ג,ש;
ובאופן דומה בשאר הבתים.
נמחק את הטבלה הקודמת וניצור אחת חדשה:

Drop Table #T_Mosadot

Create Table #T_Mosadot(Shem VarChar(Max),Yamim Int)

Insert Into #T_Mosadot Select 'בית א',70

Insert Into #T_Mosadot Select 'בית ב',20

Insert Into #T_Mosadot Select 'בית ג',1

Insert Into #T_Mosadot Select 'בית ד',127

Insert Into #T_Mosadot Select 'בית ה',0

וכעת נשלוף את הרשימה:

Select *

From #T_Mosadot M

Left Join #T_Yamim Y

On M.Yamim%Power(2,Y.Yom)>=Power(2,Y.Yom-1)

26/09/2010:  דרך חלופית לשליפה האחרונה- בעזרת Bitwise And:

Select *
From #T_Mosadot M
Left Join #T_Yamim Y
On M.Yamim & Power(2,Y.Yom-1)<>0;

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

כתיבת תגובה

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