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