مرکزی مواد پر جائیں
ماڈیول 7 · سبق 4 از 4کورس میں 28/57~14 min
ماڈیول اسباق (4/4)

تکراری CTEs: صوابدیدی گہرائی کے درجہ بندی

خود شمولیت (ماڈیول 5) درجہ بندی کی صرف ایک سطح تلاش کرتا ہے: بچہ → والدین لیکن کیا ہوتا ہے اگر درجہ بندی 3، 5، یا n سطح گہری ہو، اور آپ پہلے سے نہیں جانتے کہ کتنے ہیں؟ آپ کو بار بار آنے والے CTEs کی ضرورت ہے: a 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. یہ مرحلہ 2 کو اس وقت تک دہراتا ہے جب تک کہ تکراری اصطلاح 0 نئی قطاریں نہیں بناتی۔
  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> Audio')۔ راستے سے آرڈر کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

تکراری اصطلاح میں شامل ہونا c.parent_id کو درخت (t.id) میں پہلے سے موجود قطار سے جوڑتا ہے۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش کا جائزہ لیں۔

ورزش#sql.m7.l4.e2
کوششیں: 0لوڈ ہو رہا ہے…

ہر زمرے کے لیے، id، نام اور root_name دکھائیں (درخت کے اوپری حصے میں جڑ کے زمرے کا نام جس سے اس کا تعلق ہے)۔ جڑوں میں root_name = نام ہوتا ہے۔ آئی ڈی سے آرڈر کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

روٹ_نام کو والدین (t.root_name) سے بچے (c) تک پھیلائیں۔

3 کوششوں کے بعد حل دستیاب ہے۔