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

06/01/2010

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

שייך לקטגוריה: Uncategorized — תגים: , , , — גרי רשף @ 20:51

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

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

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

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;

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

Follow

Get every new post delivered to your Inbox.

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