
OrderID IN, כשהתוצאה של הפנימית נמצאת בתוך הסוגריים. השאילתה הפנימית רצה קודם, ואחר כך החיצונית.o1 לחיצונית ו-od לפנימית) ומשווים od.OrderID = o1.OrderID, כך שהפנימית מחשבת רק את ההזמנה של השורה הנוכחית.WHERE OrderID IN (SELECT OrderID FROM [Order Details] GROUP BY OrderID HAVING SUM(Quantity * UnitPrice) > 15000), WHERE od.OrderID = o1.OrderID.הטקסט המלא של הדקות הראשונות בהרצאה «פקודת Select בתוך Select» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום וברוכים הבאים להרצאה על סלקט בתוך סלקט, איך לעשות שאילתה בתוך שאילתה. זה משהו מאוד נהוג ומאוד מקובל. למעשה זה מתחרה של ג'וין.
אני יונתן רבזין ואתם בהרצאות של מכללת פרקטיקיו. כמו שאתם רואים יש לנו את כל ההרצאות שמגיעות אליכם הביתה על מחשב המאובטח שלנו תמורת 350 שקל לחודש ללא כל התחייבות.
וזה כולל את כל ההרצאות שיש לנו באתר שזה מאוד יפה. יפה. אז יש לנו מתחברים לאתר מתחברים לשרת sql ואנחנו רוצים לעשות סלקט בתוך סלקט למה שנרצה לעשות בתוך סלקט בתוך סלקט כן אז בואו נעשה דוגמה שאנחנו רוצים להראות את כל ההזמנות כל ההזמנות אנחנו רוצים להראות בואו נעשה פה כוכבית שיהיה לנו
ככה פחות מקום הבוס התקשר אליי ואמר לי יוני תראה לנו את כל ההזמנות אני עושה לו סלקט כוכבית for מורדרס אבל רק אלו שסכום ההזמנה שלהם, שסכום ההזמנה שלהם גדול מ-15,000.
זאת אומרת, יש פה לכל הזמן, הוא רוצה לראות את השורות האלו, אבל הוא לא רוצה לראות 830 שורות. הוא רוצה לראות את השורות האלו כמו שהן, כך הוא רוצה לראות אותן.
אבל מה? שאני אסנן לו אלו שהם, אז סך הכל ההזמנה מתחת ל-15,000 דולר. עכשיו פה אין סכום הזמנה, סכום ההזמנה נמצא במקום אחר, Order Details.
בואו נראה מה יש לנו בתוך אורדר דיטלס. סלקט כוכבית from order details. עכשיו אני שם סוגריים מרובעים כי הוא חושב שאורדר זה מילה שמורה אז הוא צובע לי אותה בכחול. אתם רואים הוא עושה את המילת אורדר בכחול.
אני אומר לו חמוד זה שם הטבלה במיוחד ששם הטבלה זה עם רווח אז אני אגיד לו תתעלם מהרווח הזה. שמים סוגריים מרובעים כמו גרשיים בדוס.
למה הוא לא עובד? הוא אומר לא קיים אורדר דיטלס. למה לא קיים אורדר דיטלס? כי אני מריץ פקודות מול תבלת המאסטר הראשית. אני צריך להריץ את זה מול נורטווילד.
ויש לנו בעצם רשימת פירוט לכל הזמנה. מה זה נותן לנו? יש לנו בעצם, כמו בהרצאה של גרופביי, הסברנו איך לעשות בעצם לכל הזמנה פה למעלה, אתם רואים הזמנה 148, לקחת את שלושת השורות ולעשות אותן כשורה אחת, שורה אחת שאומרת סכום ההזמנה.
אז אני אעשה את זה זריז, אני לא אחזור על ההסבר. בהרצאה לגרופביי, גרופ ביי בדיוק עשינו את זה אז אני אעשה פה את זה זריז אני עושה גרופ ביי אורדר איידי תחלק את כל הטבלה הזאת כל הטבלה הזאתי לפי קבוצות לפי אורדר איידי ותעשה מכל קבוצה שורה ותראה לי במסך את הסכום לכל קבוצה סכום וסכום
ההזמנה זה למעשה קוונטיטי כפול יוניט פרייס תעשה סכום לאחר שאתה מכפיל את שתי עמודות לחצתי על תף אחד צבעתי את שם הטבלה לחצתי על תף אחד ואז הוא נתן לי רשימת עמודות כתבתי לו תקשיב תעשה עמודת unit price כפול quantity כמות כפול מחיר ועל כל הקבוצה תפעיל לי סכום מה זה קבוצה מחולק לפי הזמנות ככה קיבלנו בעצם משלוש שורות שורה אחת אתם רואים
הזמנה 2048 שורה אחת 2049 שורה אחת מצוין יופי זה בדיוק מה שרציתי לא יופי עכשיו נשאר לי רק איכשהו לקשר אותם. הבוס אמר להראות לו את השורות האלו, שעבור ההזמנות, נניח 10,248, רק מעל 15,000.
כמה סכום ההזמנה? סכום ההזמנה פה 440, לא מתאים לי. אז פה אני אומר לו כזה דבר, הווינג, תסנן לי את אלו שהסכום שלהם, יותר נכון תשאיר לי את אלו שהסכום שלהם 15,000.
רק יישארו פה למטה עכשיו רק תוצאות, רק שורות שנותנות לי אמת. היא תן לי אמת פה רק אלו שהם סכום הזמנה גדול מ-15,000 בואו נראה בואו נראה צובע בכחול עושה אקזיקיוט שלוש הזמנות יופי אני צריך להראות לבוס רק שלוש הזמנות מצוין עכשיו איך אני אקשר את הסלקט הזה לסלקט הזה יופי אז אני למעשה רוצה לחבר ביניהם אז אני אראה לכם כמה
שיטות לחבר ביניהם השיטה שהיא בעצם הכי מקובלת והכי טובה לא מבחינת הביצועים, אבל הכי טובה ככה מבחינת היום-יום.
נכתוב דבר כזה, תעשה לי את הסלקט הגדול של כל ההזמנות האלו, where, איפה, עבור כל שורה orderid in רשימה כלשהי.
מה זה רשימה? 10865.10981.11300 ומשהו. אתם רואים? תיקח את כל השורות ותעבור שורה-שורה, תבדוק האם מורדר איידי אין רשימה הזאת אם הוא ברשימה האם התוצאה של הבדיקה שלך אמת אם מורדר איידי ברשימה הזאת השורה נשארת במסך אם לא היא עפה מהתוצאות בואו נראה שזה באמת עובד באמת קיבלנו פה שלוש שורות במקום כל מה שהיה לנו אבל מה הבעיה מחר בבוקר תיכנס
עוד הזמנה או שאולי בלילה תיכנס עוד הזמנה אני רוצה שאילתא אוניברסלית לא שאילתא שאני צריך להעתיק ידנית מספרי הזמנות כן אז למעשה במקום שאני אכתוב את זה עדנית אני לוקח את כל זה ושימו לב בסוגריים שלו נותן לו את הסלקט הזה.
הרי הסלקט הזה הוא זה שנתן לי את התוצאה נכון? שימו לב אני הכנסתי את הסלקט הזה בסוגריים של האין שלו. אתם מבינים?
במקום שאני אכתוב את זה עדנית הוא כתב את זה עבורי. הסלקט הפנימי הוציא את ההזמנות שהמחיר שלהם מעל 15,000 שקל ומעביר אותם לסלקט הראשי. למעשה במערכת מתבצעת קודם כל פקודות של הסוגריים הפנימיות ואחרי שהפקודות של הסוגריים הפנימיות נגמרות יוצאת תוצאה שאני רוצה בתוצאה שיהיה רק אורדר
איי-די כי אורדר איי-די אין אורדר איי-די אני לא צריך את הסכום כרגע במסך השאילתה הפנימית תחזיר לי את ההזמנות של סכום ההזמנה הגדול מ-15,000 השאילתה הפנימית תחזיר לי הזמנות של סכום ההזמנה הגדול מ-15,000 בואו נראה שזה באמת עובד הנה באמת החזיר לי את שלושת אלו ושלושת אלו יעברו כתוצאה לסלקט הראשי.
הבנתם איזה יופי? וגם אם מחר בבוקר תיכנס עוד הזמנה, התוצאות האלו כל הזמן יתעדכנו, כי אני לא כותב שום דבר ידנית, כאילו אני לא מעתיק מספרי הזמנות.
הסלקט הפנימי מחזיר לסלקט החיצוני רשימת הזמנות שגדולות מ-15,000, והסלקט החיצוני מסנן את התוצאות לפי מה שהוא צריך.
בואו נראה, וזה באמת עובד, תראו איזה יופי, זה באמת עובד. מצוין. את זה הבנתם? זה נקרא סלקט בתוך סלקט. אבל יש פה בעיה, זה עובד.
ויש לי שאלה, תראו מה אנחנו אומרים לו כל פעם לעשות. עבור כל שורה בסלקט הזה, עבור כל שורה, הוא מבצע את כל התהליך הזה שוב שוב ושוב.
למה? כי where עובר שורה שורה בסלקט הראשי, עובר שורה שורה ובודק האם התוצאות פה הן בפנים. ולא רק שהוא עושה את זה שורה שורה, הוא גם עושה לי סתם קבוצות מיותרות.
מה הוא עושה לי קבוצות על דברים שלא קשורים לשאילתה ראשית? תחשבו שהשאילתה הראשית נמצאת עכשיו בשורה, בואו תסתכלו, השאילתה הראשית, תחשבו על הביצועים דקה, נמצאת בשורה הזאת.
אין לי מה לעשות, תחשבו שאני בודק את השאילתה הפנימית. אני עכשיו בשורה הזאת, בבדיקות. הוואר עובר שורה-שורה, הגיע נניח לשורה הזאת. מה יקרה פה? הוואר יבדוק האם אורדר איי-די, האם המספר הזה נמצא בתוצאות האלו.
מה זה התוצאות האלו? הוא לקח את כל Order Details, חילק אותם לקבוצות לפי כל ה-Order IDs, חישב את כל ה-15,000 גדול, והחזיר לי תוצאה של כולם.
זאת אומרת, הוא עושה את זה שוב, שוב ושוב, אבל זה לא רלוונטי, כי אני נמצא בשורה הזאת. אני רוצה להגיד לו, תקשיב, אל תעשה לי את זה עבור כל השורות.