কম্পিউটার টিউটোরিয়াল

MySQL রিকার্সিভ CTE দক্ষতা অর্জন: হায়ারার্কি ট্রাভার্সাল এবং সিরিজ জেনারেশন

একটি রিকার্সিভ 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-এ হায়ারার্কিক্যাল ডেটা ট্রাভার্সাল (অর্গ চার্ট, ক্যাটাগরি ট্রি), সিরিজ জেনারেশন, এবং গ্রাফ ট্রাভার্সালের জন্য অপরিহার্য।

MySQL রিকার্সিভ CTE দক্ষতা অর্জন: হায়ারার্কি ট্রাভার্সাল এবং সিরিজ জেনারেশন
  1. স্ট্রিমলাইনড উবুন্টু ডেস্কটপ সেটআপ: আপনার ডটফাইলস ও বাশ স্ক্রিপ্টস অটোমেট করুন

  2. L = {a(2m)c(4n)dn bm | m,n = 0} ভাষার জন্য পুশডাউন অটোমেটা নির্মাণ C++-এ

  3. পাইথন প্রোগ্রাম: ইনসারশন সোর্ট অ্যালগরিদম

  4. অ্যান্ড্রয়েডে ActionBar-এ কাস্টম ভিউ দেখানোর পদ্ধতি