Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> SQL

การเรียนรู้ CTE แบบเรียกซ้ำของ MySQL:การข้ามลำดับชั้นและการสร้างซีรี่ส์

CTE แบบเรียกซ้ำ (นิพจน์ตารางทั่วไป) เป็นแบบสอบถามย่อยที่อ้างอิงตัวเองโดยใช้ชื่อของตัวเอง มันถูกกำหนดโดยใช้ 02 และต้องมีเงื่อนไขยุติ CTE แบบเรียกซ้ำมีประโยชน์สำหรับการสร้างอนุกรม การข้ามข้อมูลแบบลำดับชั้น และการข้ามผ่านกราฟ

ไวยากรณ์

WITH RECURSIVE cte_name (col1, col2, ...) AS (
 -- Non-recursive (base case): initial rows
 SELECT col1, col2 FROM table_name
 UNION ALL
 -- Recursive case: references cte_name
 SELECT col1, col2 FROM cte_name WHERE condition
)
SELECT * FROM cte_name;
  • ตัวแรก 15 เป็นกรณีฐานที่ให้แถวเริ่มต้น
  • 27 เพิ่มแถวจากการวนซ้ำแต่ละครั้ง (33 ลบรายการที่ซ้ำกัน)
  • ตัวที่สอง 43 คือกรณีแบบเรียกซ้ำจะทำงานจนกว่าเงื่อนไข WHERE จะล้มเหลว

ตัวอย่างที่ 1:สร้างเลขคี่ 5 หมายเลขแรก

WITH RECURSIVE odd_no (sr_no, n) AS (
 SELECT 1, 1
 UNION ALL
 SELECT sr_no + 1, n + 2
 FROM odd_no
 WHERE sr_no < 5
)
SELECT * FROM odd_no;
+-------+---+
| sr_no | n |
+-------+---+
| 1 | 1 |
| 2 | 3 |
| 3 | 5 |
| 4 | 7 |
| 5 | 9 |
+-------+---+

กรณีฐานส่งคืน (1, 1) การวนซ้ำแต่ละครั้งจะเพิ่ม sr_no ขึ้น 1 และ n คูณ 2 การเรียกซ้ำจะหยุดเมื่อ sr_no ถึง 5

ตัวอย่างที่ 2:ลำดับชั้นของพนักงาน

การใช้งานเชิงปฏิบัติมากขึ้นในลำดับชั้นของผู้จัดการ-พนักงาน ?

-- Assume: employees(id, name, manager_id)
WITH RECURSIVE org_chart (id, name, level) AS (
 -- Base: top-level manager (no manager)
 SELECT id, name, 0
 FROM employees
 WHERE manager_id IS NULL
 UNION ALL
 -- Recursive: find direct reports
 SELECT e.id, e.name, oc.level + 1
 FROM employees e
 JOIN org_chart oc ON e.manager_id = oc.id
)
SELECT * FROM org_chart ORDER BY level;

ซึ่งจะสร้างแผนผังองค์กรโดยเริ่มจากผู้จัดการระดับบนสุด (ระดับ 0) และค้นหารายงานทั้งหมดในแต่ละระดับซ้ำๆ

ประเด็นสำคัญ

  • รวมเงื่อนไขการยุติไว้ในส่วนคำสั่ง WHERE ของ SELECT แบบเรียกซ้ำเพื่อหลีกเลี่ยงการวนซ้ำไม่สิ้นสุด
  • MySQL มีขีดจำกัดการเรียกซ้ำเริ่มต้นที่ 1,000 ครั้ง (กำหนดค่าได้ผ่าน 51 ).
  • ใช้ 68 เพื่อประสิทธิภาพ 73 เฉพาะเมื่อต้องลบรายการที่ซ้ำกันออกเท่านั้น

บทสรุป

CTE แบบเรียกซ้ำใช้ 88 เพื่อกำหนดการสืบค้นแบบอ้างอิงตนเองด้วยกรณีพื้นฐานและกรณีแบบเรียกซ้ำ สิ่งเหล่านี้จำเป็นสำหรับการสำรวจข้อมูลแบบลำดับชั้น (แผนภูมิองค์กร แผนผังหมวดหมู่) การสร้างซีรีส์ และการสำรวจกราฟใน MySQL

การเรียนรู้ CTE แบบเรียกซ้ำของ MySQL:การข้ามลำดับชั้นและการสร้างซีรี่ส์