একটি রিকার্সিভ CTE (Common Table Expression) হল একটি সাবকোয়ারি যা নিজের নাম ব্যবহার করে নিজেকে রেফারেন্স করে। এটি WITH RECURSIVE ব্যবহার করে ডিফাইন করা হয় এবং এর একটি টার্মিনেটিং কন্ডিশন থাকতে হবে। রিকার্সিভ CTE সিরিজ জেনারেট করার জন্য, হায়ারার্কিক্যাল ডেটা ট্রাভার্স করার জন্য, এবং গ্রাফ ট্রাভার্সালের জন্য উপকারী।
সিনট্যাক্স
WITH RECURSIVE cte_name (col1, col2, ...) AS ( -- Non-recursive (base case): initial rows SELECT col1, col2 FROM table_name UNION ALL -- Recursive case: references cte_name SELECT col1, col2 FROM cte_name WHERE condition ) SELECT * FROM cte_name;
- প্রথম
SELECTহলো বেস কেস যা প্রাথমিক সারি প্রদান করে। UNION ALLপ্রতিটি ইটেরেশন থেকে সারি যোগ করে (DISTINCTডুপ্লিকেট রিমুভ করে)।- দ্বিতীয়
SELECTহলো রিকার্সিভ কেস যা WHERE কন্ডিশন ফেল할 때까지 চলে।
উদাহরণ ১: প্রথম ৫টি বিজোড় সংখ্যা জেনারেট করুন
WITH RECURSIVE odd_no (sr_no, n) AS ( SELECT 1, 1 UNION ALL SELECT sr_no + 1, n + 2 FROM odd_no WHERE sr_no < 5 ) SELECT * FROM odd_no;
+-------+---+ | sr_no | n | +-------+---+ | 1 | 1 | | 2 | 3 | | 3 | 5 | | 4 | 7 | | 5 | 9 | +-------+---+
বেস কেস (1, 1) রিটার্ন করে। প্রতিটি ইটেরেশন sr_no-কে ১ দিয়ে এবং n-কে ২ দিয়ে ইনক্রিমেন্ট করে। রিকার্সন থেমে যায় যখন sr_no ৫-এ পৌঁছায়।
উদাহরণ ২: কর্মচারী হায়ারার্কি
একটি আরও বাস্তব ব্যবহার: ম্যানেজার-কর্মচারী হায়ারার্কি ট্রাভার্স করা:
-- Assume: employees(id, name, manager_id) WITH RECURSIVE org_chart (id, name, level) AS ( -- Base: top-level manager (no manager) SELECT id, name, 0 FROM employees WHERE manager_id IS NULL UNION ALL -- Recursive: find direct reports SELECT e.id, e.name, oc.level + 1 FROM employees e JOIN org_chart oc ON e.manager_id = oc.id ) SELECT * FROM org_chart ORDER BY level;
এটি একটি অর্গানাইজেশনাল ট্রি তৈরি করে শীর্ষ-স্তরের ম্যানেজার (লেভেল ০) থেকে শুরু করে এবং প্রতিটি লেভেলে সব রিপোর্ট রিকার্সিভলি খুঁজে বের করে।
মূল পয়েন্টগুলো
- রিকার্সিভ SELECT-এর WHERE ক্লজে সবসময় একটি টার্মিনেটিং কন্ডিশন অন্তর্ভুক্ত করুন ইনফিনিট লুপ এড়াতে।
- MySQL-এ ডিফল্ট রিকার্সন লিমিট ১০০০ ইটেরেশন (কনফিগারেবল
cte_max_recursion_depth통해서)। - পারফরম্যান্সের জন্য
UNION ALLব্যবহার করুন; ডুপ্লিকেট রিমুভ করার জন্য শুধুUNION DISTINCTব্যবহার করুন।
উপসংহার
রিকার্সিভ CTE WITH RECURSIVE ব্যবহার করে সেলফ-রেফারেন্সিং কোয়ারি ডিফাইন করে একটি বেস কেস এবং রিকার্সিভ কেসের সাথে। এগুলো MySQL-এ হায়ারার্কিক্যাল ডেটা ট্রাভার্সাল (অর্গ চার্ট, ক্যাটাগরি ট্রি), সিরিজ জেনারেশন, এবং গ্রাফ ট্রাভার্সালের জন্য অপরিহার্য।