தொகுதி பாடங்கள் (4/4)
சுழல்நிலை CTEகள்: தன்னிச்சையான ஆழமான படிநிலைகள்
ஒரு சுய-சேர்தல் (தொகுதி 5) ஒரு படிநிலையின் ஒரே ஒரு நிலைஐக் கண்டறியும்: குழந்தை → பெற்றோர். ஆனால் படிநிலை 3, 5 அல்லது n நிலைகள் ஆழமாக இருந்தால் என்ன நடக்கும், மற்றும் எத்தனை என்று உங்களுக்கு முன்கூட்டியே தெரியாதா? உங்களுக்கு சுழற்சி CTEகள் தேவை: 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 அல்ல: அதிகரிப்பு மட்டும்).
- சுழல்நிலை சொல் 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;முயற்சி செய்து பாருங்கள்
வகைப் படிநிலையைத் தட்டையாக்க, 'tree' எனப் பெயரிடப்பட்ட சுழல்நிலை CTE ஐப் பயன்படுத்தவும். ஐடி, பெயர், ஆழம் (வேர்களுக்கு 1, குழந்தைகளுக்கு 2, முதலியன) மற்றும் பாதை (எ.கா. 'எலெட்ரோனிகா > ஆடியோ') ஆகியவற்றைக் காட்டு. பாதை மூலம் ஆர்டர் செய்யுங்கள்.
குறிப்பைக் காட்டு
சுழல்நிலைச் சொல்லில் உள்ள சேர் என்பது, மரத்தில் (t.id) ஏற்கனவே உள்ள வரிசையுடன் c.parent_id ஐ இணைக்கிறது.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
மதிப்பாய்வு பயிற்சி
ஒவ்வொரு வகைக்கும், ஐடி, பெயர் மற்றும் ரூட்_பெயர் (மரத்தின் உச்சியில் உள்ள வேர் வகையின் பெயர்) ஆகியவற்றைக் காட்டவும். வேர்களுக்கு root_name = பெயர் உள்ளது. ஐடி மூலம் ஆர்டர் செய்யுங்கள்.
குறிப்பைக் காட்டு
பெற்றோரிடமிருந்து ரூட்_பெயரை (t.root_name) குழந்தைக்கு (c) பரப்பவும்.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்