שיעורי מודול (2/3)
CTE מרובים ומשורשרים
CTEs מרובים ומשורשרים
האלגנטיות של ביטויים WITH באמת זורחת כאשר אתה משרשרת כמה יחד. אתה יכול להגדיר CTEs רבים ברצף, להפריד ביניהם עם פסיק.
והנה משהו שטהרנים חוזרים אוהבים: CTEs מאוחרים יותר יכולים לקרוא נתונים מ-CTEs קודמים, לפרק חישובים עוקבים חתיכה אחר חתיכה!
דוגמה למולטי-CTE
WITH premium_customers AS (
SELECT customer_id, SUM(total_amount) AS total_spent
FROM orders
GROUP BY customer_id
),
top_customers AS (
SELECT * FROM premium_customers
WHERE total_spent > 5000
)
SELECT c.first_name, tc.total_spent
FROM customers c
JOIN top_customers tc ON c.id = tc.customer_id;זה תכנות בסגנון בלוק! כל בלוק עושה עבודה אחת בלבד.
הגדר שני CTEs עוקבים: \n1) 'order_totals' מחשב את 'customer_id' ואת 'order_count' המבוצע באמצעות 'COUNT(*)' מ-'orders'.\n2) 'gold_users' קורא מ-'order_totals' מסנן לקוחות עם 'order_count >= 2'.\nב-'קודם קודמים' בטבלה 'קודם כל'. 'last_name') עם 'gold_users' (ON c.id = g.customer_id), והצג גם את ה-'order_count' שלהם.
הצג רמז
הפרד סיכומי הזמנה ומשתמשי זהב באמצעות פסיק (ללא שנייה WITH!)
הפתרון זמין לאחר 3 ניסיונות
כעת בוא נשתמש במספר CTEs כדי לפשט מדדים: צור 'max_price' (מחלץ שורה בודדת עם 'max_value' באמצעות 'MAX(unit_price)' מתוך 'order_items'). בשאילתה הראשית, חלץ כל 'מזהה_מוצר' ו'מחיר_יחידה' מתוך 'פריטים_הזמנה' והראה כמה זה שונה מהמחיר המקסימלי, תוך חישוב '(SELECT max_value FROM max_price) - unit_price AS difference'. אין הצטרפות - השתמש בשאילתת משנה ב-CTE כדי לקבל ערך יחיד!
הצג רמז
WITH max_price AS (...) SELECT product_id, unit_price, (SELECT max_value FROM max_price) - unit_price FROM order_items;
הפתרון זמין לאחר 3 ניסיונות