தொகுதி பாடங்கள் (2/4)
சுய-சேர்தல்: தன்னுடன் ஒரு அட்டவணை
சில நேரங்களில் நீங்கள் பயணிக்க விரும்பும் உறவு இருவருக்குமிடையே இல்லை இருக்கும்
வெவ்வேறு அட்டவணைகள், ஆனால் ஒரே அட்டவணையின் வரிசைகளுக்கு இடையில். வழக்கமான உதாரணம்: a
"வகை → துணைப்பிரிவு" படிநிலை, இதில் பெற்றோர் மற்றும் குழந்தை இருவரும் வரிசைகள்
அதே categories அட்டவணை, parent_id ஆல் இணைக்கப்பட்டது.
ஒரு வரிசையையும் (குழந்தை) மற்றும் "அதன்" மற்றொரு வரிசையையும் (பெற்றோர்) ஒன்றாகப் படிக்க நீங்கள் பயன்படுத்துகிறீர்கள்
சுய இணை: ஒரே அட்டவணை இரண்டு முறை FROM இல் இரண்டு முறை தோன்றும்
வெவ்வேறு மாற்றுப்பெயர்கள்.
தொடரியல்
SELECT colonne
FROM tabella AS alias_a
JOIN tabella AS alias_b ON alias_a.foreign_key = alias_b.id;மாற்றுப்பெயர் ** கட்டாயம்**: நாம் AS a / AS b ஐத் தவிர்த்துவிட்டால், PostgreSQL இல் இல்லை
name அல்லது id என்று எழுதும் போது இரண்டு பிரதிகளில் எதைக் குறிப்பிடுகிறோம் என்பதை அறிய வழி.
-- Ogni sotto-categoria con il nome della categoria padre:
SELECT child.name AS subcategory,
parent.name AS category
FROM categories AS child
JOIN categories AS parent ON child.parent_id = parent.id;எளிய ஆங்கிலத்தில் படிக்கவும்: "categories என்ற வரிசைகளை குழந்தை, மற்றும்
ஒவ்வொருவருக்கும் categories என்ற வரிசையைக் கண்டறியும் பெற்றோர் அதன் id
குழந்தையின் parent_id".
முடிவு மூல வகைகளை விலக்குகிறது (parent_id = NULL உள்ளவை)
ஏனெனில் ஒரு INNER JOIN எந்தப் பொருத்தமும் இல்லாமல் வரிசைகளைத் தவிர்க்கிறது. நீங்கள் சேர்க்க விரும்பினால்
அவர்கள், LEFT JOIN ஐப் பயன்படுத்தவும்.
"வேர்களையும் வைத்திருக்க" இடதுபுறத்தில் சுயமாக இணையுங்கள்
-- Tutte le categorie, con nome del padre o NULL se sono radice:
SELECT child.name AS category,
parent.name AS parent
FROM categories AS child
LEFT JOIN categories AS parent ON child.parent_id = parent.id;இப்போது parent = NULL உடன் 9 வரிசைகள் (தரவுத்தொகுப்பில் உள்ள ஒவ்வொரு வகையும்) கிடைக்கும்
3 வேர்களுக்கு.
சுய-சேர்தலுடன் ஒருங்கிணைத்தல்
இது GROUP BY உடன் நன்றாக இணைந்து "ஒவ்வொருவருக்கும் எத்தனை குழந்தைகள்
பெற்றோருக்கு உண்டு":
SELECT p.name AS parent_category,
COUNT(c.id) AS children
FROM categories AS p
LEFT JOIN categories AS c ON c.parent_id = p.id
WHERE p.parent_id IS NULL -- solo le radici
GROUP BY p.name
ORDER BY p.name;இரண்டு முக்கியமான விவரங்களைக் கவனியுங்கள்:
WHERE p.parent_id IS NULLவடிப்பான்கள் முன் சேர்வதற்கு: நாங்கள் மட்டும் எடுத்துக்கொள்கிறோம் வேர்கள் "இடது கை அட்டவணை".- குழந்தைகள் இல்லாத வேர்களுக்கு
COUNT(c.id)(COUNT(*)அல்ல) 0 ஐ வழங்குகிறது, அதேசமயம்LEFT JOINவரிசையின் காரணமாகCOUNT(*)1 ஐ வழங்கும் NULL.
நீங்களே முயற்சி செய்து பாருங்கள்
ஒக்னி சோட்டோ-பிரிவு (வகை கான் பெற்றோர்_ஐடி பூஜ்யம் அல்ல), மோஸ்ட்ரா இல் நோம் டெல்லா சோட்டோ-கேடகோரியா இ இல் நோம் டெல்லா சுவா கேடகோரியா-பேட்ரே. காரணமாக காலன்: துணைப்பிரிவு, வகை. ஒர்டினா பெர்டகேகேஷன் போய் ஒர் துணைப்பிரிவு.
குறிப்பைக் காட்டு
La condizione del self-JOIN è child.parent_id = parent.id.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
மதிப்பாய்வு பயிற்சி
ogni வகை-ரேடிஸ் (parent_id IS NULL), மோஸ்ட்ரா இல் நோம் இ இல் நியூமெரோ டி சோட்டோ-வகை. காரணமாக காலன்: பெயர், குழந்தைகள். பெயருக்கு ஓர்டினா. உனா எவன்சுவல் ரேடிஸ் சென்சா ஃபிக்லி கான் 0 அடங்கும்.
குறிப்பைக் காட்டு
இரண்டு முறை வகைகளில் இடதுபுறம் சேரவும் (பெற்றோருக்கான மாற்றுப்பெயர் p, குழந்தைக்கான c). குழந்தைகள் இல்லாத ரூட்களில் 0 ஐப் பெற, COUNT(c.id) ஐப் பயன்படுத்தவும், COUNT(*) அல்ல.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்