মূল কন্টেন্টে যান
মডিউল 7 · 4-এর পাঠ 4কোর্সে 28/57~14 min
মডিউল পাঠ (4/4)

পুনরাবৃত্ত CTEs: স্বেচ্ছাচারী-গভীর স্তরবিন্যাস

একটি স্ব-যোগদান (মডিউল 5) একটি অনুক্রমের মাত্র একটি স্তর খুঁজে পায়: শিশু → অভিভাবক কিন্তু অনুক্রমটি 3, 5, বা n স্তর গভীর হলে কি হবে, এবং আপনি আগে থেকে জানেন না কত? আপনার প্রয়োজন পুনরাবৃত্ত CTEs: ক CTE যে নিজেই ফলাফলগুলিকে পুনরাবৃত্তিমূলকভাবে "প্রসারিত" করতে বোঝায়।

ecommerce ডেটাসেটে, categories টেবিলের 3টি মূল রয়েছে (Elettronica, Libri, Casa) এবং 2টি শিশু - একটি 2-স্তরের গাছ। এটি একটি সহজ কেস কিন্তু প্যাটার্ন শেখার জন্য যথেষ্ট।

বাক্য গঠন

SQL
WITH RECURSIVE nome (col1, col2, …) AS (
  -- (1) Termine BASE: le righe di partenza
  SELECT …
  FROM   …
  WHERE  …

  UNION ALL

  -- (2) Termine RICORSIVO: si appoggia a "nome" stesso per espandere
  SELECT …
  FROM   tabella  t
  JOIN   nome    n  ON …
)
SELECT * FROM nome;

এটি অনুশীলনে কীভাবে কাজ করে:

  1. PostgreSQL একবার বেস টার্ম চালায়।
  2. এটি ঠিক হিসাবে উত্পাদিত সারিগুলি ব্যবহার করে পুনরাবৃত্ত শব্দ কার্যকর করে "ইনপুট" (পুরো CTE নয়: শুধুমাত্র বৃদ্ধি)।
  3. পুনরাবৃত্ত শব্দটি 0টি নতুন সারি তৈরি না করা পর্যন্ত এটি ধাপ 2 পুনরাবৃত্তি করে।
  4. চূড়ান্ত ফলাফল হল সমস্ত ধাপের UNION ALL।

উদাহরণ 1: গভীরতা এবং পথ সহ গাছ

SQL
WITH RECURSIVE tree AS (
  -- base: le radici (parent_id IS NULL)
  SELECT id,
         name,
         parent_id,
         1                 AS depth,
         name              AS path
  FROM   categories
  WHERE  parent_id IS NULL

  UNION ALL

  -- ricorsivo: per ogni categoria che ha come parent una riga già in tree
  SELECT c.id,
         c.name,
         c.parent_id,
         t.depth + 1,
         t.path || ' > ' || c.name
  FROM   categories c
  JOIN   tree       t ON c.parent_id = t.id
)
SELECT id, name, depth, path
FROM   tree
ORDER BY path;

প্রথম পুনরাবৃত্তি 3টি সারি তৈরি করে (লেভেল 1 এ শিকড়)। দ্বিতীয়টি পুনরাবৃত্তি 6 শিশু (স্তর 2) খুঁজে পায়। তৃতীয় পুনরাবৃত্তি খুঁজে পায় কিছুই → করা হয়নি।

উদাহরণ 2: একটি নোড দেওয়া হয়েছে, এর মূল খুঁজুন

একটি "টপ-ডাউন → বটম-আপ" ভেরিয়েন্ট: আমরা রুটের আইডি নিচে বরাবর প্রচার করি গাছ

SQL
WITH RECURSIVE tree AS (
  SELECT id,
         name,
         parent_id,
         id   AS root_id,
         name AS root_name
  FROM   categories
  WHERE  parent_id IS NULL

  UNION ALL

  SELECT c.id,
         c.name,
         c.parent_id,
         t.root_id,    -- propago lo stesso id_radice
         t.root_name   -- e nome
  FROM   categories c
  JOIN   tree       t ON c.parent_id = t.id
)
SELECT id, name, root_name
FROM   tree
ORDER BY id;

চেষ্টা করে দেখুন

ব্যায়াম#sql.m7.l4.e1
প্রচেষ্টা: 0লোড হচ্ছে...

ক্যাটাগরি হায়ারার্কি সমতল করতে 'ট্রি' নামে একটি পুনরাবৃত্ত CTE ব্যবহার করুন। আইডি, নাম, গভীরতা (শিকড়ের জন্য 1, শিশুদের জন্য 2, ইত্যাদি) এবং পথ (যেমন 'Elettronica > অডিও') দেখান। পথ দ্বারা আদেশ.

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

পুনরাবৃত্ত পদে যোগদানটি c.parent_idকে ট্রিতে (t.id) ইতিমধ্যে উপস্থিত সারিটির সাথে লিঙ্ক করে।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম পর্যালোচনা করুন

ব্যায়াম#sql.m7.l4.e2
প্রচেষ্টা: 0লোড হচ্ছে...

প্রতিটি বিভাগের জন্য, আইডি, নাম এবং রুট_নাম (গাছের শীর্ষে মূল বিভাগের নাম এটির অন্তর্গত) দেখান। Roots have root_name = name. আইডি দিয়ে অর্ডার করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

অভিভাবক (t.root_name) থেকে সন্তানের (c) কাছে root_name প্রচার করুন।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ