دروس الوحدة (2/3)
CTEs متعددة ومتسلسلة
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أخيرًا، انضم إلى جدول 'customers' (استخراج 'first_name' و 'last_name') مع 'gold_users' (ON c.id = g.customer_id)، وإظهار أيضًا 'order_count' الخاص بهم.
إظهار التلميح
افصل بين إجماليات الطلب ومستخدمي الذهب بفاصلة (لا يوجد ثانية مع!)
الحل متاح بعد 3 من المحاولات
الآن دعونا نستخدم عدة CTEs لتبسيط المقاييس: أنشئ "max_price" (استخرج صفًا واحدًا بـ "max_value" باستخدام "MAX(unit_price)" من "order_items"). في الاستعلام الرئيسي، استخرج كل "product_id" و"unit_price" من "order_items" وأظهر مدى اختلافه عن الحد الأقصى للسعر، مع حساب "(SELECT max_value FROM max_price) - Unit_price AS Difference". لا يوجد انضمام - استخدم استعلامًا فرعيًا في CTE للحصول على قيمة واحدة!
إظهار التلميح
مع الحد الأقصى للسعر AS (...) حدد معرف المنتج، سعر الوحدة، (حدد الحد الأقصى_القيمة من الحد الأقصى_السعر) - سعر الوحدة من الطلب_العناصر؛
الحل متاح بعد 3 من المحاولات