יום רביעי, 25 בינואר 2012

קישור בין טבלאות שלא על בסיס שוויון

כידוע, קליקויו מקשר בין טבלאות ע"פ שדות עם שמות זהים. יש לכך יתרון בקלות הפיתוח (לא צריך להגדיר את הקשרים באופן מפורש), אך גם חיסרון - כאשר רוצים לקשר ע"פ אופרטור שונה משוויון.
למשל, נניח שאנחנו רוצים לקשר בין טבלת מוצרים לטבלת סניפים, כך שכל מוצר יקושר לסניף שבו הוא לא קיים (נכון שניתן להציג חיתוך כזה בתצוגה, אך לפעמים ישנו צורך כזה בסקריפט). הקישור הוא על בסיס האופרטור "שונה".
בשאילתת SQL זה כמובן פשוט מאוד - יוצרים JOIN עם סימן "שונה מ-". בקליקויו זה לא אפשרי.
באותו אופן אנו עשויים לרצות לקשר על בסיס "גדול מ" ו"קטן מ", ואופרטורים נוספים.
אמנם בקליקויו קיימת האפשרות של intervalmatch, אך היא מכסה רק חלק מהמקרים - קישור על בסיס טווח ערכים חופף.
ובכן, מי שמכיר בסיסי נתונים היטב, יודע שלמעשה בכל Join, בסיס-הנתונים מבצע תחילה Cross Join, כלומר יוצר את כל הקומבינציות האפשריות בין רשומות שתי הטבלאות, ורק לאחר מכן גוזר מתוך כמות הרשומות (המפלצתית בד"כ) את הרשומות הרצויות, ע"פ משפט השוויון.
אנחנו יכולים להשתמש באותו עיקרון. אמנם בבסיס הנתונים הפעולה מתבצעת באופן פנימי ללא fetch ולכן במהירות עצומה, ואילו אנו נסבול מביצועים איטיים, אבל זה כמובן רק הסקריפט. עם זאת על רשומות רבות זה בד"כ לא יעבוד בגלל חריגת זיכרון.
אם-כן, הדרך היא להביא את הטבלה הראשונה, ואז במשפט Join להביא את הטבלה השנייה, כאשר אין כל שדה משותף ביניהן. לאחר מכן על הטבלה הגדולה שנוצרה, נוכל לבצע את צמצום הרשומות ע"י משפט Where.

אין תגובות:

הוסף רשומת תגובה