একটি রিকার্সিভ CTE (সাধারণ টেবিল এক্সপ্রেশন) একটি সাবকোয়েরি যা নিজের নাম ব্যবহার করে নিজেই উল্লেখ করে। এটি 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সদৃশ অপসারণ করে)।- দ্বিতীয়
SELECTWHERE শর্ত ব্যর্থ না হওয়া পর্যন্ত রিকার্সিভ কেস চলে৷
উদাহরণ 1:প্রথম 5টি বিজোড় সংখ্যা তৈরি করুন
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 1 এবং n দ্বারা 2 বৃদ্ধি করে। sr_no 5 এ পৌঁছালে পুনরাবৃত্তি বন্ধ হয়ে যায়।
উদাহরণ 2:কর্মচারী শ্রেণিবিন্যাস
একজন ম্যানেজার-কর্মচারী শ্রেণিবিন্যাসের মধ্য দিয়ে আরও ব্যবহারিক ব্যবহার?
-- 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;
এটি শীর্ষ-স্তরের ব্যবস্থাপক (লেভেল 0) থেকে শুরু করে একটি সাংগঠনিক গাছ তৈরি করে এবং প্রতিটি স্তরে সমস্ত প্রতিবেদন পুনরাবৃত্তি করে।
মূল পয়েন্ট
- অসীম লুপ এড়াতে পুনরাবৃত্ত SELECT এর WHERE ক্লজে সর্বদা একটি সমাপ্তি শর্ত অন্তর্ভুক্ত করুন।
- MySQL এর 1000 পুনরাবৃত্তির ডিফল্ট পুনরাবৃত্তি সীমা রয়েছে (
cte_max_recursion_depthএর মাধ্যমে কনফিগার করা যায় )। -
UNION ALLব্যবহার করুন কর্মক্ষমতা জন্য;UNION DISTINCTশুধুমাত্র যখন সদৃশ অপসারণ করা আবশ্যক।
উপসংহার
পুনরাবৃত্তিমূলক CTE গুলি WITH RECURSIVE ব্যবহার করে একটি বেস কেস এবং রিকার্সিভ কেস সহ স্ব-রেফারেন্সিং প্রশ্নগুলি সংজ্ঞায়িত করতে। MySQL-এ ক্রমিক ডেটা ট্রাভার্সাল (অর্জি চার্ট, ক্যাটাগরি ট্রি), সিরিজ জেনারেশন এবং গ্রাফ ট্র্যাভার্সালের জন্য এগুলি অপরিহার্য৷