שאילתות CTE ב-SQL SERVER


ראשי התיבות של CTE הן Common Table Expression, ביטויים המאפשרים לנו ליצור מעין טבלה זמנית שמתקיימת רק לפרק זמן הריצה של אותה שאילתה המגדירה אותה. צורת הכתיבה הזאת נכנסה לשימוש החל מגרסת SQL Server 2005 והמבנה הבסיסי שלה נראה ככה:

ניתו לפנות ל-CTE כמו לטבלה רגילה, ו-CTE אף יכולה לפנות לעצמה, אך הפנייה חייבת לבוא מייד אחרי הגדרת ה-CTE עצמה כחלק מאותו בלוק של T-SQL, שכן הטבלה הזמנית אינה נשמרת בשום מקום. CTE יכולה להיות שימושית במגוון רחב של מקרים כמו למשל פישוט של שאילתה והפיכתה לקריאה יותר, פריסה מובנית של כמה פעולות חישוביות, התייחסות לעמודה באופן חיצוני או יצירת רקורסיה.


בואו ניקח לדוגמה מצב שבו נרצה להציג דירוג של שכר עובדים בחברה לפי מחלקה אך נהיה מעוניינים להציג רק את 3 בעלי השכר הגבוה ביותר בכל מחלקה. נוכל להשתמש בשאילתה הבאה כדי להציג את מספרי העובדים, שכר ודירוג:

אבל אם נרצה למיין את 3 המרוויחים הגבוהים מכל מחלקה ניתקל בבעיה מפני שאסור לשים פונקציות אנליטיות בתוך סעיף ה-WHERE ובגלל הסדר שבו SQL Server מנתח את השאילתות שהוא מריץ, לא נוכל גם לסנן ע"פ הכינוי של העמודה. CTE יכול להיות פתרון טוב במקרה כזה, שכן הוא מאפשר לנו להתייחס לכינוי עמודת הדירוג "מבחוץ":

בצורה הזאת הענקנו שם לשאילתה ועכשיו אנחנו יכולים להשתמש בכינויים של העמודות המחושבות שלה כאילו היו עמודות בטבלה לכל דבר.


בפוסט הבא נראה איך אפשר להשתמש ב-CTE כדי לבצע שאילתות רקורסיביות על מנת לייצג רמות היררכיות.

© כל הזכויות שמורות לאלעד פלג הדרכות 2020