متسلسلة أرقام
جزء من قسم ما وراء الأساسيات في رحلة SQL على Coddy — الدرس 20 من 27.
لقد تعرفت على الكلمة المفتاحية WITH في الأساسيات لتسمية استعلام فرعي، والمعروف أيضًا باسم CTE (تعبير جدول مشترك). يذهب تعبير CTE المتكرر خطوة أبعد: فهو يسمح للاستعلام الفرعي بالإشارة إلى نفسه، مما يؤدي إلى بناء النتيجة صفاً بصف.
يُنشئ الإصدار الأبسط تسلسلاً من الأرقام بدون جدول أساسي. الشكل هو نفسه دائماً:
WITH RECURSIVE counter(n) AS (
SELECT 1 -- anchor: صف البداية
UNION ALL
SELECT n + 1 FROM counter WHERE n < 5 -- recursive: بناء التالي من السابق
)
SELECT n FROM counterاقرأها كالتالي: ابدأ بـ n = 1، ثم استمر في إضافة صفوف حيث كل n هو الـ n + 1 السابق، وتوقف عندما يتوقف WHERE عن المطابقة. النتيجة هي 1, 2, 3, 4, 5.
يتم ربط جزئي الجسم بواسطة UNION ALL. الجزء الأول هو المرساة (anchor): وهي صفوف البداية. والجزء الثاني هو الخطوة التكرارية (recursive step): وهي تقوم بالاستعلام من الـ CTE نفسها.
التحدي
سهلاكتب تعبير جدول مشترك (CTE) متكرر يسمى powers بعمودين:
i: مؤشر التكرار، يبدأ بـ1p:2مرفوعاً للقوةi(2،4،8، …)
توقف بمجرد أن تتجاوز p القيمة 1000. أرجع كلا العمودين، مرتبين حسب i تصاعدياً.
ورقة مرجعية
يسمح الـ CTE المتكرر (recursive CTE) للاستعلام الفرعي بالإشارة إلى نفسه، مما يؤدي إلى بناء النتائج صفاً بصف:
WITH RECURSIVE counter(n) AS (
SELECT 1 -- anchor: الصف الابتدائي
UNION ALL
SELECT n + 1 FROM counter WHERE n < 5 -- recursive step: الخطوة المتكررة
)
SELECT n FROM counter- نقطة الارتكاز (Anchor): الصف (أو الصفوف) الأولية (أول
SELECT) - الخطوة المتكررة: تستعلم من الـ CTE نفسه لإنتاج الصف التالي
- تتوقف عندما لا يعود شرط
WHEREمتطابقاً - يتم دمج الجزأين باستخدام
UNION ALL
جرّب بنفسك
WITH RECURSIVE powers(i, p) AS (
-- anchor: i=1, p=2
-- recursive: i+1, p*2، حتى تصل p إلى 1000
)
SELECT i, p FROM powers ORDER BY i
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.