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

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;

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

כתיבת תגובה

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 שכבר עוקבים אחריו