CTE แบบเวียนเกิดสำหรับลำดับชั้น
ไล่ดูข้อมูลแบบลำดับชั้น (ผังองค์กร ความคิดเห็นแบบเธรด การสำรวจกราฟ) ด้วย WITH RECURSIVE และเงื่อนไขหยุด
CTE แบบเวียนเกิดสำหรับลำดับชั้น เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องเรียกซ้ำ
SQL แบบธรรมดาไม่สามารถไล่ไปตามต้นไม้ที่มีความลึกไม่ทราบแน่ชัดได้ เช่น พ่อแม่ของพ่อแม่ หรือลูกของลูก CTE แบบเรียกซ้ำเป็นวิธีแก้ปัญหาตาม SQL มาตรฐาน
โครงสร้าง
CTE แบบเรียกซ้ำมีสองส่วนที่เชื่อมกันด้วย UNION ALL:
WITH RECURSIVE name AS (
-- 1. Anchor query: seed rows
SELECT ...
UNION ALL
-- 2. Recursive step: references the CTE itself
SELECT ...
FROM name JOIN ...
)
SELECT * FROM name;การไล่ตามแผนผังองค์กร
ค้นหาพนักงานทั้งหมดที่ขึ้นตรงหรืออยู่ภายใต้ผู้จัดการที่กำหนด ไม่ว่าจะโดยตรงหรือผ่านลำดับชั้น:
WITH RECURSIVE reports AS (
-- anchor: the manager themself
SELECT id, full_name, manager_id, 0 AS depth
FROM employees WHERE id = 42
UNION ALL
-- recurse: people whose manager is in reports
SELECT e.id, e.full_name, e.manager_id, r.depth + 1
FROM employees e
JOIN reports r ON r.id = e.manager_id
)
SELECT * FROM reports ORDER BY depth, full_name;ความคิดเห็นแบบลำดับชั้น
ไล่ไปตามต้นไม้การสนทนาจากราก:
WITH RECURSIVE thread AS (
SELECT id, parent_id, body, 0 AS depth, ARRAY[id] AS path
FROM comments WHERE id = $1
UNION ALL
SELECT c.id, c.parent_id, c.body, t.depth + 1, t.path || c.id
FROM comments c
JOIN thread t ON c.parent_id = t.id
)
SELECT * FROM thread ORDER BY path;การสิ้นสุด
การเรียกซ้ำจะหยุดเมื่อขั้นตอนแบบเรียกซ้ำไม่ส่งคืนแถวใหม่
การป้องกันการวนซ้ำไม่รู้จบ
หากกราฟของคุณมีวงจร ให้ติดตามโหนดที่เยี่ยมชมแล้ว:
WITH RECURSIVE walk AS (
SELECT id, ARRAY[id] AS path FROM nodes WHERE id = $1
UNION ALL
SELECT e.target_id, w.path || e.target_id
FROM edges e
JOIN walk w ON e.source_id = w.id
WHERE e.target_id <> ALL(w.path)
)
SELECT * FROM walk;ลำดับตัวเลข
CTE แบบเรียกซ้ำยังสามารถสร้างลำดับได้ด้วย:
WITH RECURSIVE n(i) AS (
VALUES (1)
UNION ALL
SELECT i + 1 FROM n WHERE i < 100
)
SELECT i, i*i AS square FROM n;รายการส่วนประกอบ
แยกผลิตภัณฑ์ออกเป็นส่วนประกอบทั้งหมด รวมถึงชุดประกอบย่อย:
WITH RECURSIVE bom AS (
SELECT part_id, sub_part_id, qty FROM parts WHERE part_id = $1
UNION ALL
SELECT p.part_id, p.sub_part_id, p.qty * bom.qty
FROM parts p
JOIN bom ON bom.sub_part_id = p.part_id
)
SELECT sub_part_id, SUM(qty) AS total_qty FROM bom GROUP BY sub_part_id;ขีดจำกัดความลึก
เพื่อความปลอดภัย ให้จำกัดความลึกของการเรียกซ้ำ:
WITH RECURSIVE tree AS (
SELECT id, parent_id, 0 AS depth FROM nodes WHERE id = $1
UNION ALL
SELECT n.id, n.parent_id, t.depth + 1
FROM nodes n JOIN tree t ON n.parent_id = t.id
WHERE t.depth < 10
)
SELECT * FROM tree;UNION เทียบกับ UNION ALL
โดยทั่วไปมักเลือกใช้ UNION ALL ส่วน UNION จะลบรายการซ้ำ จึงมีประโยชน์เมื่อสามารถเข้าถึงโหนดหนึ่งได้หลายเส้นทาง
ประสิทธิภาพ
CTE แบบเรียกซ้ำจะถูกประเมินซ้ำเป็นขั้นตอน ตารางทำงานของแต่ละขั้นคือแถวที่ขั้นตอนก่อนหน้าสร้างขึ้น จัดทำดัชนีให้คอลัมน์ที่ใช้ JOIN
สรุป
CTE แบบเรียกซ้ำใช้ไล่สำรวจลำดับชั้นและกราฟ
- จุดตั้งต้น + UNION ALL + ขั้นตอนแบบเรียกซ้ำ
- หยุดเมื่อขั้นตอนแบบเรียกซ้ำไม่ส่งคืนแถว
- ใช้อาร์เรย์เส้นทางเพื่อหยุดวงจร
ตรวจสอบความเข้าใจ
คำสำคัญใดทำให้ CTE เป็น CTE แบบเรียกซ้ำ
เรียนรู้ SQL ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 46
- บทเรียน
- 183
คำถามที่พบบ่อย
บทเรียน “CTE แบบเวียนเกิดสำหรับลำดับชั้น” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “CTE แบบเวียนเกิดสำหรับลำดับชั้น” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “CTE แบบเวียนเกิดสำหรับลำดับชั้น”
ไล่ดูข้อมูลแบบลำดับชั้น (ผังองค์กร ความคิดเห็นแบบเธรด การสำรวจกราฟ) ด้วย WITH RECURSIVE และเงื่อนไขหยุด คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “CTE แบบเวียนเกิดสำหรับลำดับชั้น” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คำค้นย่อยแบบสเกลาร์ แถว และตาราง
- คำค้นย่อยแบบสัมพันธ์กับแบบไม่สัมพันธ์
- นิพจน์ตารางร่วม (WITH)
- CTE แบบเวียนเกิดสำหรับลำดับชั้น