முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 7 · பாடம் 4 இன் 4பாடத்திட்டத்தில் 28/57~14 min
தொகுதி பாடங்கள் (4/4)

சுழல்நிலை CTEகள்: தன்னிச்சையான ஆழமான படிநிலைகள்

ஒரு சுய-சேர்தல் (தொகுதி 5) ஒரு படிநிலையின் ஒரே ஒரு நிலைஐக் கண்டறியும்: குழந்தை → பெற்றோர். ஆனால் படிநிலை 3, 5 அல்லது n நிலைகள் ஆழமாக இருந்தால் என்ன நடக்கும், மற்றும் எத்தனை என்று உங்களுக்கு முன்கூட்டியே தெரியாதா? உங்களுக்கு சுழற்சி CTEகள் தேவை: 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. சுழல்நிலை சொல் 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ஏற்றுகிறது…

வகைப் படிநிலையைத் தட்டையாக்க, 'tree' எனப் பெயரிடப்பட்ட சுழல்நிலை CTE ஐப் பயன்படுத்தவும். ஐடி, பெயர், ஆழம் (வேர்களுக்கு 1, குழந்தைகளுக்கு 2, முதலியன) மற்றும் பாதை (எ.கா. 'எலெட்ரோனிகா > ஆடியோ') ஆகியவற்றைக் காட்டு. பாதை மூலம் ஆர்டர் செய்யுங்கள்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

சுழல்நிலைச் சொல்லில் உள்ள சேர் என்பது, மரத்தில் (t.id) ஏற்கனவே உள்ள வரிசையுடன் c.parent_id ஐ இணைக்கிறது.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

மதிப்பாய்வு பயிற்சி

உடற்பயிற்சி#sql.m7.l4.e2
முயற்சிகள்: 0ஏற்றுகிறது…

ஒவ்வொரு வகைக்கும், ஐடி, பெயர் மற்றும் ரூட்_பெயர் (மரத்தின் உச்சியில் உள்ள வேர் வகையின் பெயர்) ஆகியவற்றைக் காட்டவும். வேர்களுக்கு root_name = பெயர் உள்ளது. ஐடி மூலம் ஆர்டர் செய்யுங்கள்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

பெற்றோரிடமிருந்து ரூட்_பெயரை (t.root_name) குழந்தைக்கு (c) பரப்பவும்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்