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

06/01/2010

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

Filed under: 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;

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

5 תגובות »

  1. […] בתחום 1-510 נתאים תת קבוצה באופן דומה למה שמופיע בפוסט יחס של רבים לרבים ללא טבלת עזר. הפרוצדורה הראשית P_Pitron תבצע את התרגיל הזה – פעם על […]

    פינגבאק של כיצד פותרים בעיות סודוקו? - גרי רשף — 19/01/2012 @ 18:51

  2. […] בה בעקיפין מספר פעמים (אופציית Multi-Value ב-Reporting Services, יחס של רבים לרבים ללא טבלת עזר) ואציג אותה כאן בצורה מסודרת: נניח שיש לנו טבלת מכירות […]

    פינגבאק של חיתוך בין רשימות - Israel Database Portal — 07/11/2011 @ 12:35

  3. […] בה בעקיפין מספר פעמים בעבר (אופציית Multi-Value ב-Reporting Services, יחס של רבים לרבים ללא טבלת עזר) ואציג אותה כאן בצורה מסודרת: נניח שיש לנו טבלת מכירות […]

    פינגבאק של חיתוך בין רשימות « הבלוג של גרי רשף — 24/08/2011 @ 19:28

  4. […] הדרך השניה היא ליצור את כל המספרים מ-1 ועד 2n, ועבור כל אחד למצוא את החזקות של 2 שיוצרות אותו בעזרת האופרטור & (להלן- Bitwise And): […]

    פינגבאק של יצירת כל תתי הקבוצות של קבוצה נתונה « הבלוג של גרי רשף — 06/12/2010 @ 07:41

  5. […] בתחום 1-510 נתאים תת קבוצה באופן דומה למה שמופיע בפוסט יחס של רבים לרבים ללא טבלת עזר. הפרוצדורה הראשית P_Pitron תבצע את התרגיל הזה – פעם על […]

    פינגבאק של כיצד פותרים בעיות סודוקו? « הבלוג של גרי רשף — 09/03/2010 @ 21:36


RSS feed for comments on this post. TrackBack URI

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s

בלוג בוורדפרס.קום.

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