كيف تعمل CTEs التكرارية
حالة أساسية بالإضافة إلى خطوة تكرارية
كيف تعمل CTEs التكرارية درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.
ما المقصود بـ CTE التكراري؟
تعبير الجدول الشائع التكراري هو تعبير جدول شائع يشير إلى نفسه. ويتيح لكم كتابة استعلامات تكرر خطوة معينة حتى يتحقق شرط ما — على نحو يشبه الحلقة التكرارية، لكن باستخدام SQL خالصة.
تُعرَّف تعبيرات الجداول الشائعة التكرارية باستخدام الكلمة المفتاحية WITH RECURSIVE، وهي مثالية لاجتياز البيانات الهرمية أو الشبيهة بالرسوم البيانية، مثل المخططات التنظيمية وأشجار المجلدات وهياكل قوائم مكونات المنتجات.
البنية ذات الجزأين
يتكون كل تعبير جدول شائع تكراري من جزأين بالضبط، يفصل بينهما UNION ALL:
1. الحالة الأساسية — عبارة SELECT غير تكرارية تُرجع الصفوف الابتدائية.
2. الخطوة التكرارية — عبارة SELECT تربط تعبير الجدول الشائع بنفسه، فتُنتج المستوى التالي من الصفوف.
يواصل المحرك تشغيل الخطوة التكرارية وتجميع النتائج حتى لا تُنتج أي صفوف جديدة.
WITH RECURSIVE cte_name AS (
-- Base case
SELECT ...
UNION ALL
-- Recursive step (references cte_name)
SELECT ... FROM source JOIN cte_name ON ...
)
SELECT * FROM cte_name;العد من 1 إلى 5
يعد أبسط تعبير جدول شائع تكراري الأرقام. وتبدأ الحالة الأساسية بالقيمة 1. وتضيف الخطوة التكرارية القيمة 1 في كل تكرار. وتعمل عبارة WHERE داخل الخطوة التكرارية بوصفها شرط الإنهاء — ومن دونها سيستمر الاستعلام إلى ما لا نهاية.
WITH RECURSIVE counter(n) AS (
SELECT 1
UNION ALL
SELECT n + 1 FROM counter WHERE n < 5
)
SELECT n FROM counter;التنفيذ خطوة بخطوة
إليكم كيفية معالجة المحرك لتعبير العداد التكراري تكرارًا بعد تكرار:
التكرار 0 (الحالة الأساسية): يُرجع {1}.
التكرار 1: يطبق الخطوة التكرارية على {1}، ويُرجع {2}.
التكرار 2: يطبق الخطوة التكرارية على {2}، ويُرجع {3}.
التكراران 3 و4: يُرجع {4} ثم {5}.
التكرار 5: تكون WHERE n < 5 خاطئة عندما تكون قيمة n=5، لذلك لا تُرجع أي صفوف. ينتهي الاستعلام.
تشكل جميع الصفوف المجمعة — 1 و2 و3 و4 و5 — النتيجة النهائية.
إعداد جدول تسلسل هرمي
تتألق تعبيرات الجداول الشائعة التكرارية عند استخدامها مع الجداول التي تشير إلى نفسها. لننشئ جدول employees، بحيث يكون لكل موظف manager_id اختياري يشير إلى الجدول نفسه.
CREATE TABLE employees (
id INTEGER PRIMARY KEY,
name VARCHAR(50),
manager_id INTEGER REFERENCES employees(id)
);
INSERT INTO employees VALUES
(1, 'Alice', NULL),
(2, 'Bob', 1),
(3, 'Carol', 1),
(4, 'Dave', 2),
(5, 'Eve', 2),
(6, 'Frank', 3);اجتياز التسلسل الهرمي
يمكننا الآن اجتياز سلسلة التقارير الكاملة بدءًا من الرئيس التنفيذي (Alice، id=1). تختار الحالة الأساسية Alice، بينما تبحث الخطوة التكرارية عن جميع الموظفين الذين تطابق قيمة manager_id لديهم معرّفًا موجودًا مسبقًا في تعبير الجدول الشائع.
تتضمن النتيجة كل موظف يمكن الوصول إليه انطلاقًا من Alice، مهما بلغ عمق الشجرة.
WITH RECURSIVE org_tree AS (
SELECT id, name, manager_id, 0 AS depth
FROM employees
WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id, ot.depth + 1
FROM employees e
JOIN org_tree ot ON e.manager_id = ot.id
)
SELECT depth, name FROM org_tree ORDER BY depth, name;تتبع المسار
من التحسينات الشائعة إنشاء سلسلة مسار تعرض السلسلة الكاملة من الجذر إلى كل عقدة. فنحن نلصق الأسماء مع فصلها باستخدام ' -> ' كلما تعمقنا في التكرار.
يسهّل ذلك عرض التنقل بأسلوب مسار التنقل أو تصحيح أخطاء التسلسلات الهرمية العميقة.
WITH RECURSIVE org_tree AS (
SELECT id, name, name AS path
FROM employees
WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, ot.path || ' -> ' || e.name
FROM employees e
JOIN org_tree ot ON e.manager_id = ot.id
)
SELECT name, path FROM org_tree ORDER BY path;تحديد عمق التكرار
قد تؤدي البيانات العميقة أو الدائرية إلى استمرار تشغيل تعبير جدول شائع تكراري وقتًا طويلًا جدًا. فيما يلي ممارستان آمنتان:
1. تتبع العمق وإضافة عبارة WHERE — تضمن WHERE depth < 10 عدم تجاوز 10 مستويات.
2. استخدام عمود لاكتشاف الدورات — توفر بعض قواعد البيانات (PostgreSQL 14+) صيغة CYCLE لاكتشاف زيارات العقد المتكررة تلقائيًا.
WITH RECURSIVE org_tree AS (
SELECT id, name, 0 AS depth
FROM employees
WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, ot.depth + 1
FROM employees e
JOIN org_tree ot ON e.manager_id = ot.id
WHERE ot.depth < 10
)
SELECT depth, name FROM org_tree;UNION أم UNION ALL في تعبيرات الجداول الشائعة التكرارية
تستخدم الخطوة التكرارية في معظم الحالات UNION ALL بدلًا من UNION. إليكم السبب:
تزيل UNION الصفوف المكررة بعد كل تكرار من خلال مقارنة مجموعة النتائج بأكملها — وهذا مكلف للغاية، وقد يغير الدلالات في الرسوم البيانية التي يمكن الوصول فيها إلى العقدة نفسها بشكل مشروع عبر مسارات متعددة.
تحافظ UNION ALL على جميع الصفوف من دون إزالة التكرارات، ما يجعلها أسرع وصحيحة لاجتياز الأشجار. استخدموا UNION فقط عند وجود حاجة محددة لإزالة التكرارات وفهم تكلفة الأداء المترتبة على ذلك.
إنشاء سلسلة من التواريخ
تفيد تعبيرات الجداول الشائعة التكرارية أيضًا في إنشاء تسلسلات من التواريخ. يُنتج هذا المثال كل يوم من أيام أسبوع محدد — وهو نمط يُستخدم غالبًا لإنشاء تقارير التقويم أو سد الفجوات في بيانات السلاسل الزمنية.
WITH RECURSIVE date_series AS (
SELECT DATE '2024-01-01' AS day
UNION ALL
SELECT day + INTERVAL '1 day'
FROM date_series
WHERE day < DATE '2024-01-07'
)
SELECT day FROM date_series;العثور على جميع مرؤوسي مدير واحد
يمكنكم تهيئة الحالة الأساسية بأي عقدة محددة — وليس بالجذر فقط. نبدأ هنا من Bob (id=2) ونعثر على كل من يرفع تقاريره إليه مباشرة أو بطريقة غير مباشرة.
يفيد هذا النمط في عمليات التحقق من الصلاحيات، وتجميعات الشجرة الفرعية، أو حصر لوحات المعلومات في قسم واحد.
WITH RECURSIVE subordinates AS (
SELECT id, name
FROM employees
WHERE id = 2
UNION ALL
SELECT e.id, e.name
FROM employees e
JOIN subordinates s ON e.manager_id = s.id
)
SELECT name FROM subordinates;تحقق سريع
اختبروا مدى فهمكم لكيفية عمل تعبيرات الجداول الشائعة التكرارية.
مراجعة الدرس
تعلّمتم في هذا الدرس كيفية عمل تعبيرات الجداول الشائعة التكرارية:
البنية: يتكون كل تعبير جدول شائع تكراري من حالة أساسية (الصفوف الابتدائية) مرتبطة بـخطوة تكرارية (عبارة SELECT تشير إلى نفسها) باستخدام UNION ALL.
الإنهاء: يكرر المحرك الخطوة التكرارية ويجمع النتائج حتى تُرجع الخطوة صفرًا من الصفوف.
الاستخدامات الشائعة: اجتياز المخططات التنظيمية وأشجار المجلدات، وإنشاء تسلسلات الأرقام أو التواريخ، وحساب المسارات، والعثور على جميع العقد في شجرة فرعية.
نصائح الأمان: أدرجوا دائمًا شرط إنهاء (حدًا للعمق أو حارسًا للدورات)، وفضّلوا UNION ALL على UNION لتحسين الأداء.
الأسئلة الشائعة
هل درس «كيف تعمل CTEs التكرارية» مجاني؟
نعم — نص درس «كيف تعمل CTEs التكرارية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.
ماذا ستتعلم في «كيف تعمل CTEs التكرارية»؟
حالة أساسية بالإضافة إلى خطوة تكرارية تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟
لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «كيف تعمل CTEs التكرارية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟
نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- كيف تعمل CTEs التكرارية
- استعراض شجرة الفئات
- إنشاء السلاسل والتسلسلات
- تجنّب الحلقات اللانهائية