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

சுய-சேர்தல்: தன்னுடன் ஒரு அட்டவணை

சில நேரங்களில் நீங்கள் பயணிக்க விரும்பும் உறவு இருவருக்குமிடையே இல்லை இருக்கும் வெவ்வேறு அட்டவணைகள், ஆனால் ஒரே அட்டவணையின் வரிசைகளுக்கு இடையில். வழக்கமான உதாரணம்: a "வகை → துணைப்பிரிவு" படிநிலை, இதில் பெற்றோர் மற்றும் குழந்தை இருவரும் வரிசைகள் அதே categories அட்டவணை, parent_id ஆல் இணைக்கப்பட்டது.

ஒரு வரிசையையும் (குழந்தை) மற்றும் "அதன்" மற்றொரு வரிசையையும் (பெற்றோர்) ஒன்றாகப் படிக்க நீங்கள் பயன்படுத்துகிறீர்கள் சுய இணை: ஒரே அட்டவணை இரண்டு முறை FROM இல் இரண்டு முறை தோன்றும் வெவ்வேறு மாற்றுப்பெயர்கள்.

தொடரியல்

SQL
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 என்று எழுதும் போது இரண்டு பிரதிகளில் எதைக் குறிப்பிடுகிறோம் என்பதை அறிய வழி.

SQL
-- 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 ஐப் பயன்படுத்தவும்.

"வேர்களையும் வைத்திருக்க" இடதுபுறத்தில் சுயமாக இணையுங்கள்

SQL
-- 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 உடன் நன்றாக இணைந்து "ஒவ்வொருவருக்கும் எத்தனை குழந்தைகள் பெற்றோருக்கு உண்டு":

SQL
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;

இரண்டு முக்கியமான விவரங்களைக் கவனியுங்கள்:

  1. WHERE p.parent_id IS NULL வடிப்பான்கள் முன் சேர்வதற்கு: நாங்கள் மட்டும் எடுத்துக்கொள்கிறோம் வேர்கள் "இடது கை அட்டவணை".
  2. குழந்தைகள் இல்லாத வேர்களுக்கு COUNT(c.id) (COUNT(*) அல்ல) 0 ஐ வழங்குகிறது, அதேசமயம் LEFT JOIN வரிசையின் காரணமாக COUNT(*) 1 ஐ வழங்கும் NULL.

நீங்களே முயற்சி செய்து பாருங்கள்

உடற்பயிற்சி#sql.m5.l2.e1
முயற்சிகள்: 0ஏற்றுகிறது…

ஒக்னி சோட்டோ-பிரிவு (வகை கான் பெற்றோர்_ஐடி பூஜ்யம் அல்ல), மோஸ்ட்ரா இல் நோம் டெல்லா சோட்டோ-கேடகோரியா இ இல் நோம் டெல்லா சுவா கேடகோரியா-பேட்ரே. காரணமாக காலன்: துணைப்பிரிவு, வகை. ஒர்டினா பெர்டகேகேஷன் போய் ஒர் துணைப்பிரிவு.

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

La condizione del self-JOIN è child.parent_id = parent.id.

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

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

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

ogni வகை-ரேடிஸ் (parent_id IS NULL), மோஸ்ட்ரா இல் நோம் இ இல் நியூமெரோ டி சோட்டோ-வகை. காரணமாக காலன்: பெயர், குழந்தைகள். பெயருக்கு ஓர்டினா. உனா எவன்சுவல் ரேடிஸ் சென்சா ஃபிக்லி கான் 0 அடங்கும்.

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

இரண்டு முறை வகைகளில் இடதுபுறம் சேரவும் (பெற்றோருக்கான மாற்றுப்பெயர் p, குழந்தைக்கான c). குழந்தைகள் இல்லாத ரூட்களில் 0 ஐப் பெற, COUNT(c.id) ஐப் பயன்படுத்தவும், COUNT(*) அல்ல.

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