SQL | שאילתת JOIN עם מופע אחרון בטבלה שניה
-
@www לדעתי תלוי כמה רשומות אתה מחזיר.
ז"א, אם אתה מחזיר רשומה אחת, (נניח אתה רוצה לקבל את הלוג האחרון רק ללקוח ספציפי) אז אין הבדל בכל שיטה שתבחר.
אם זה מחזיר הרבה תוצאות, הייתי משתמש בLEFT JOIN רגיל, ועושה GROUP BY על התוצאה, ומבקש MAX על השדה של תאריך הלוג.
אני חושב שזה יותר זריז ויעיל.דבר נוסף, אם מדובר בממש הרבה נתונים, (אני מדבר על כמויות מאד מאד גדולות - בעיקר בטבלת הלוג) , וחשוב לך מאד המהירות תגובה, אתה יכול לשמור את התאריך של הלוג האחרון כנתון סטטי בטבלת הלקוחות (אפשרי גם עם טריגר)
זה מאד לא נכון מבחינה "חוקית", אבל אם יש לך שיקול של מהירות ייתכן שזה עדיף. (שוב, רק במידה ואתה רואה שיש לך עיכוב מאד גדול - זה קורה בד"כ כשיש ממש טון רשומות) -
@clickone אמר בSQL | שאילתת JOIN עם מופע אחרון בטבלה שניה:
@www לדעתי תלוי כמה רשומות אתה מחזיר.
ז"א, אם אתה מחזיר רשומה אחת, (נניח אתה רוצה לקבל את הלוג האחרון רק ללקוח ספציפי) אז אין הבדל בכל שיטה שתבחר.אני מחזיר רשומות בודדות בסוף. 1 - 10
אם זה מחזיר הרבה תוצאות, הייתי משתמש בLEFT JOIN רגיל, ועושה GROUP BY על התוצאה, ומבקש MAX על השדה של תאריך הלוג.
אני חושב שזה יותר זריז ויעיל.דבר נוסף, אם מדובר בממש הרבה נתונים, (אני מדבר על כמויות מאד מאד גדולות - בעיקר בטבלת הלוג) , וחשוב לך מאד המהירות תגובה, אתה יכול לשמור את התאריך של הלוג האחרון כנתון סטטי בטבלת הלקוחות (אפשרי גם עם טריגר)
הלוג מכיל כרגע 576072 רשומות, בקטנה...
זה מאד לא נכון מבחינה "חוקית", אבל אם יש לך שיקול של מהירות ייתכן שזה עדיף. (שוב, רק במידה ואתה רואה שיש לך עיכוב מאד גדול - זה קורה בד"כ כשיש ממש טון רשומות)
אין עיכוב בינתיים.
-
@clickone אמר בSQL | שאילתת JOIN עם מופע אחרון בטבלה שניה:
אם זה מחזיר הרבה תוצאות, הייתי משתמש בLEFT JOIN רגיל, ועושה GROUP BY על התוצאה, ומבקש MAX על השדה של תאריך הלוג.
זה אכן מה שצריך לעשות, ומה שבstackoverflow הציעו אחרת זה בגלל ששמה התבקשו להגיע לעוד נתונים של השורה הזו מה שלא יתאפשר ע"י MAX.
-
@dovid אמר בSQL | שאילתת JOIN עם מופע אחרון בטבלה שניה:
זה אכן מה שצריך לעשות, ומה שבstackoverflow הציעו אחרת זה בגלל ששמה התבקשו להגיע לעוד נתונים של השורה הזו מה שלא יתאפשר ע"י MAX.
אתה מתכוון עוד נתונים מהטבלה הראשונה או השנייה?
לא הצלחתי להבין למה זה יותר חסכוני, למה לא עדיף לסנן את השורות לפני הJOIN ולחסוך אלפי שורות מיותרות מהטבלה הראשונה? -
@www באופן כללי בSQL אתה תמיד אומר מה שאתה רוצה, ומאמין שהוא עושה את זה טוב. (הפקפוקים צריכים לבוא רק כשהמקרה שלך לא קלאסי או כשבדיעבד המציאות "חורקת").
אתה יכול להיות רגוע, אתה יכול לבדוק ולראות שהדרך שאמרנו מהירה יותר מסינון מוקדם.
הסינון המקודם כופה על השרת דרך שנראית לך טובה יותר, ועלולה שלא לתת לו לבחור דרכים טובות מזו. לפעמים חייבים לכפות דרך או בגלל שיודעים מראש שהדרך בה השרת יבחר היא שגויה, או כי זה ההתנסחות היחידה שמביאה את התוצאה הרצויה כמו מה שקרה שם בSO.@www אמר בSQL | שאילתת JOIN עם מופע אחרון בטבלה שניה:
אתה מתכוון עוד נתונים מהטבלה הראשונה או השנייה?
מהשניה. הם רצו לאתר בטבלה השניה את השורה שבשדה X היא המקסימום, ומאותה שורה לקחת עוד כמה שדות. במקרה כזה נדרש לעשות קוד מסורבל יותר מאשר במקרה שלך. המקרה שלך זו שאילתת קיבוץ קלאסית, וכמות השורות בה לא רלוונטי.
-
הכי טוב זה לבדוק בעצמך את ההבדל, הייתי כותב לך את שני השאילתות אבל אין לי את השמות וגם לא ציינת אם מדובר בMYSQL או MSSQL (משנה טיפה בסינטקס).
אני מצרף קישורים כדי שתנוח דעתך:
https://stackoverflow.com/questions/14164784/mysql-using-group-by-vs-subselect-in-columns-list
https://stackoverflow.com/questions/3156090/which-is-faster-join-with-group-by-or-a-subquery -
@www אמר בSQL | שאילתת JOIN עם מופע אחרון בטבלה שניה:
שפת תוצאות
הנכון: שפה הצהרתית (דקלרטיבית)
רוצה לומר: אתה מצהיר שאלו התוצאות שאתה רוצה והוא צריך "לשבור את הראש" איך להביא לך אותם.אגב מסורת מקובלת מגדולי ה DBA (מ.ד. מהר נוף, למי שמכיר) תמיד לעשות פרוצדורות, ולא שאילתות זה מאפשר לדטה בייס הרבה יותר תיכנון ואופטימיזצה.
כמו"כ בפרוצדורה (וגם בסקריפט) אני אישית לא חושש להשתמש בטבלאות זמניות, אפילו עם אינדקסים בתוך הטבלה הזמנית, כדי "לעזור" למנוע וגם למפתח עם שאילתות מורכבות. בטבלאות זמניות אתה יכול לעשות כבתוך שלך (כגון להניף דגלים, לצבוע שורות וכדומה) בלי "לטנף" את הדטה בייס. אבל ברור שכל מקרה לגופו ואין בזה שום כללים.