ماڈیول اسباق (4/4)
تکراری CTEs: صوابدیدی گہرائی کے درجہ بندی
خود شمولیت (ماڈیول 5) درجہ بندی کی صرف ایک سطح تلاش کرتا ہے: بچہ → والدین لیکن کیا ہوتا ہے اگر درجہ بندی 3، 5، یا n سطح گہری ہو، اور آپ پہلے سے نہیں جانتے کہ کتنے ہیں؟ آپ کو بار بار آنے والے CTEs کی ضرورت ہے: a 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 نہیں: صرف اضافہ)۔
- یہ مرحلہ 2 کو اس وقت تک دہراتا ہے جب تک کہ تکراری اصطلاح 0 نئی قطاریں نہیں بناتی۔
- حتمی نتیجہ تمام مراحل کا
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> Audio')۔ راستے سے آرڈر کریں۔
اشارہ دکھائیں۔
تکراری اصطلاح میں شامل ہونا c.parent_id کو درخت (t.id) میں پہلے سے موجود قطار سے جوڑتا ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
ہر زمرے کے لیے، id، نام اور root_name دکھائیں (درخت کے اوپری حصے میں جڑ کے زمرے کا نام جس سے اس کا تعلق ہے)۔ جڑوں میں root_name = نام ہوتا ہے۔ آئی ڈی سے آرڈر کریں۔
اشارہ دکھائیں۔
روٹ_نام کو والدین (t.root_name) سے بچے (c) تک پھیلائیں۔
3 کوششوں کے بعد حل دستیاب ہے۔