মডিউল পাঠ (4/4)
পুনরাবৃত্ত CTEs: স্বেচ্ছাচারী-গভীর স্তরবিন্যাস
একটি স্ব-যোগদান (মডিউল 5) একটি অনুক্রমের মাত্র একটি স্তর খুঁজে পায়: শিশু → অভিভাবক কিন্তু অনুক্রমটি 3, 5, বা n স্তর গভীর হলে কি হবে, এবং আপনি আগে থেকে জানেন না কত? আপনার প্রয়োজন পুনরাবৃত্ত CTEs: ক CTE যে নিজেই ফলাফলগুলিকে পুনরাবৃত্তিমূলকভাবে "প্রসারিত" করতে বোঝায়।
ecommerce ডেটাসেটে, categories টেবিলের 3টি মূল রয়েছে
(Elettronica, Libri, Casa) এবং 2টি শিশু - একটি 2-স্তরের গাছ। এটি একটি
সহজ কেস কিন্তু প্যাটার্ন শেখার জন্য যথেষ্ট।
বাক্য গঠন
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;এটি অনুশীলনে কীভাবে কাজ করে:
- PostgreSQL একবার বেস টার্ম চালায়।
- এটি ঠিক হিসাবে উত্পাদিত সারিগুলি ব্যবহার করে পুনরাবৃত্ত শব্দ কার্যকর করে "ইনপুট" (পুরো CTE নয়: শুধুমাত্র বৃদ্ধি)।
- পুনরাবৃত্ত শব্দটি 0টি নতুন সারি তৈরি না করা পর্যন্ত এটি ধাপ 2 পুনরাবৃত্তি করে।
- চূড়ান্ত ফলাফল হল সমস্ত ধাপের
UNION ALL।
উদাহরণ 1: গভীরতা এবং পথ সহ গাছ
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: একটি নোড দেওয়া হয়েছে, এর মূল খুঁজুন
একটি "টপ-ডাউন → বটম-আপ" ভেরিয়েন্ট: আমরা রুটের আইডি নিচে বরাবর প্রচার করি গাছ
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;চেষ্টা করে দেখুন
ক্যাটাগরি হায়ারার্কি সমতল করতে 'ট্রি' নামে একটি পুনরাবৃত্ত CTE ব্যবহার করুন। আইডি, নাম, গভীরতা (শিকড়ের জন্য 1, শিশুদের জন্য 2, ইত্যাদি) এবং পথ (যেমন 'Elettronica > অডিও') দেখান। পথ দ্বারা আদেশ.
ইঙ্গিত দেখান
পুনরাবৃত্ত পদে যোগদানটি c.parent_idকে ট্রিতে (t.id) ইতিমধ্যে উপস্থিত সারিটির সাথে লিঙ্ক করে।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
ব্যায়াম পর্যালোচনা করুন
প্রতিটি বিভাগের জন্য, আইডি, নাম এবং রুট_নাম (গাছের শীর্ষে মূল বিভাগের নাম এটির অন্তর্গত) দেখান। Roots have root_name = name. আইডি দিয়ে অর্ডার করুন।
ইঙ্গিত দেখান
অভিভাবক (t.root_name) থেকে সন্তানের (c) কাছে root_name প্রচার করুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ