עוד שאלה,

עוד שאלה,

וסליחה שאני שואל הרבה שאלות
יש לי טבלה table1, הכוללת את השדות x,y,Acc יש לי טבלה table2, הכוללת את השדות y,Acc ואני מבצע את השאילתה הבאה: select x, y, Acc from table1 where x = 7 הייתי רוצה שאותה שאילתה גם תחזיר את כל השורות מtable2, אשר ערך y בהן, שווה לערך y בשורות מtable1 התואמות את תנאי השאילתה. מה עליי להוסיף לשאילתה הנ"ל ? אולי עוד הדגשה קטנה: אני מעוניין גם בשורות מtable1 וגם בשורות מtable2 כתוצאה מאותה שאילתה בודדת. בתודה מראש, שמוליק
 

רון84

New member
כמה הבהרות

בעצם אתה רוצה להוסיף לשאילתה את שדה Acc מטבלה Table2 (אין צורך את כל השדות מהטבלה כיוון שערך y כבר ידוע מטבלה Table1). מה שאתה מבקש הוא לעשות JOIN. עכשיו השאלה היא איזה סוג. האפשרויות: 1. להציג רק את הרשומות שבהן יש התאמה ערך y משותף בין Table1 ל-Table2 2. להציג את כל הרשומות ב-Table1, ובנוסף גם את הרשומות המתאימות מTable2 (כך שאם מופיעה רשומה ב-Table1 שאין ערך y זהה ב-Table2, אז בשדה של Acc מטבלה Table2 יופיע הערך NULL. 3. כנ"ל - אבל הפוך: כל הרשומות של Table2 וערכי NULL כאשר יש אי התאמה עם Table1 אפשרות 1 נקראת INNER JOIN ואפשרויות 2,3 נקראות LEFT/RIGHT OUTER JOIN. יש גם FULL JOIN, אבל לא נראה לי שהוא עשוי לשרת את המטרה שלך. אם הבנתי נכון את השאלה, אז ההתלבטות שלך אמורה להיות בין 1 ל-2. תגיד מה מתאים לך - ונמשיך. רון
 
הבהרה

בדוגמא התיחסתי לערך y מסוים, אבל יכול להיות מקרה שאעלץ להשתמש בתנאי, עבורו מתאימים מספר ערכי y שונים (למשל y < 10). אני מציין זאת, על מנת להמחיש שאני מעוניין גם בשדה y וגם בשדה Acc (כי שדה y יכול להכיל ערכים שונים). בכל מקרה, ממה שאני מבין, מה שדרוש לי הוא: INNER JOIN, כלומר כל השורות מTABLE2 וTABLE1, כך שהשורות מTABLE2 מכילות את אותו ערך y אשר מופיע בשורות מTABLE1. תודה, שמוליק נ.ב. חשבתי לשנות את מבנה הטבלאות, כך שבTABLE2 יהיו כל נתוני שדה Acc ובTABLE1 יהיו השדות Y ו-X כך שערכי Y בTABLE1 יהיו מתאימים לערכי Y ברשומות של TABLE2. איזה מבנה עדיף ?
 

GuardianAnge1

New member
אכן מדובר ב-Inner Join

ואכן המבנה החדש עדיף כי הוא חוסך כפילויות ערכי Acc. מכיוון שאני לא יודע באיזה מסד נתונים אתה משתמש, הנה לך שאילתה תקנית:
SELECT TABLE1.x, TABLE1.y, TABLE2.Acc FROM TABLE1, TABLE2 WHERE TABLE1.y=TABLE2.y AND TABLE1.y<10​
 
תודה על העזרה,

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

GuardianAnge1

New member
הרממ...

לחיצה על תחילת קוד תוסיף לך |-הקוד-| (ללא המקפים כמובן :) לסיום קטע הקוד לחץ על סיום קוד וזה יוסיף לך |-סקוד-| (שוב.. ללא המקפים)
 
הנה התוצאה

TABLE1 ------ y, Acc TABLE2 ------ y, x​
הסבר: ברצוני לשלוף מתוך טבלה2 20 רשומות ,המתחילות במקום ה21 לפי שדה X המסודר בסדר יורד. לכן אני מבצע שליפה של 40 רשומות ראשונות, הופך להן את הסדר ואז שולף שוב 20 מתוכן והופך חזרה את הסדר. לאחר מכן, אני מעוניין לקחת את ערכי Y של אותן 20 רשומות המתקבלות, ולשלוף מטבלה1 את כל ערכי Acc אשר ערך Y שלהם, תואם את אחד מערכי Y ב20 הרשומות המדוברות. אני חושב שהמשפט הבא, מבצע את האמור:
select TABLE1.y, TABLE1.Acc from TABLE1 where TABLE1.y (select TABLE2.y from TABLE2 where TABLE2.x (SELECT TOP 20 TABLE2.x FROM (SELECT TOP 40 TABLE2.x FROM Table2 ORDER BY TABLE2.x Desc) ORDER BY TABLE2.x Asc))​
כמו כן, ניסיתי ליעל קצת את השאילתה:
select TABLE1.y, TABLE1.Acc, TABLE2.x, Table2.y from TABLE1, TABLE2 where (TABLE1.y = Table2.y) and Table2.x (SELECT TOP 20 TABLE2.x FROM (SELECT TOP 40 TABLE2.x FROM Table2 ORDER BY TABLE2.x Desc) ORDER BY TABLE2.x Asc))​
האם השאילתה השניה עובדת ? האם זה אכן יותר יעיל ? האם יש דרך יותר קצרה ויותר יעילה (אחרת) ?
 

estersh

New member
שים את המשפטים האלה כקוד

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