SQL Academy · บทเรียน

CTE แบบเวียนเกิดสำหรับลำดับชั้น

ไล่ดูข้อมูลแบบลำดับชั้น (ผังองค์กร ความคิดเห็นแบบเธรด การสำรวจกราฟ) ด้วย WITH RECURSIVE และเงื่อนไขหยุด

บทเรียน 4 จาก 413 ขั้นตอน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. คำค้นย่อยแบบสเกลาร์ แถว และตาราง
  2. คำค้นย่อยแบบสัมพันธ์กับแบบไม่สัมพันธ์
  3. นิพจน์ตารางร่วม (WITH)
  4. CTE แบบเวียนเกิดสำหรับลำดับชั้น
← กลับไปที่ SQL Academy