تخطَّ إلى المحتوى

WITH

جدول مؤقت مسمّى داخل استعلام (CTE) WITH

WITH يعرّف نتيجة مؤقتة باسم (CTE) تُستخدم كجدول عادي داخل الاستعلام الرئيسي، وتختفي بعد انتهاء تنفيذه.

WITH (يُعرف بـ Common Table Expression أو CTE) يسمّي نتيجة استعلام فرعي ليُستخدَم كجدول داخل استعلام أكبر، مما يجعل الاستعلامات المعقّدة أسهل قراءة من استعلام فرعي متداخل داخل FROM. يمكن تعريف عدة CTE في نفس الأمر، وكل واحدة قد تعتمد على التي قبلها.

WITH RECURSIVE نسخة خاصة تسمح للـ CTE بالإشارة لنفسها، مفيدة لبيانات هرمية مثل شجرة تصنيفات أو تسلسل تقارير إدارية — تتوقف تلقائيًا عندما لا ينتج الجزء التكراري صفوفًا جديدة.

الصياغة

WITH cte_name AS (
  SELECT ...
)
SELECT ... FROM cte_name;

📄 مثال

WITH big_orders AS (
  SELECT user_id, total FROM orders WHERE total > 1000
)
SELECT users.name, big_orders.total
FROM big_orders
JOIN users ON users.id = big_orders.user_id;

أهم النقاط

النقطةالوظيفة
WITH cte AS (...)تعريف جدول مؤقت مسمّى صالح فقط داخل هذا الاستعلام
عدّة CTE مفصولة بفاصلةكل واحدة يمكن أن تعتمد على التي قبلها في نفس الأمر
WITH RECURSIVEنسخة تسمح للـ CTE بالإشارة إلى نفسها لبيانات شجرية

💡 نصائح عملية

  • استخدم WITH لتسمية خطوات استعلام معقّد بدل أقواس متداخلة في FROM — يسهّل القراءة والصيانة كثيرًا
  • الجزء التكراري في WITH RECURSIVE لازم يضيق النطاق تدريجيًا (بشرط WHERE أو JOIN)، وإلا يدخل في حلقة لا تنتهي

⚠️ أخطاء شائعة

  • توقّع أن CTE مخزّنة كجدول دائم يمكن إعادة استخدامه في استعلامات أخرى — هي مؤقتة لاستعلام واحد فقط
  • كتابة WITH RECURSIVE بلا شرط إيقاف واضح في الجزء التكراري

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار SQL الكامل بالعربي.