Common Table Expressions (CTE) ใน PostgreSQL
ในโลกของการจัดการฐานข้อมูล การเขียน Query ที่ซับซ้อนและมีหลายขั้นตอนเป็นเรื่องปกติ แต่การเขียน Subquery ซ้อนกันหลายชั้น (Nested Subqueries) อาจทำให้โค้ดอ่านยากและยากต่อการบำรุงรักษา Common Table Expressions (CTE) จึงถูกออกแบบมาเพื่อแก้ไขปัญหานี้
CTE คือคุณสมบัติที่ช่วยให้คุณสามารถนิยามชุดผลลัพธ์ชั่วคราว (Temporary Result Set) ที่มีชื่อเฉพาะ เพื่อนำมาอ้างอิงใช้ซ้ำได้ภายใน Query หลัก โดยมองว่ามันคือการสร้าง ‘ตารางเสมือน’ ขึ้นมาใช้งานเพียงชั่วคราวในระหว่างการรัน Query เท่านั้น
💡 CTE คืออะไร และทำงานอย่างไร?
CTE ไม่ใช่ตารางจริงที่ถูกบันทึกไว้ในฐานข้อมูล แต่เป็นเพียงโครงสร้างทางตรรกะ (Logical Structure) ที่ช่วยจัดระเบียบโค้ด SQL ให้เป็นโมดูลย่อยๆ ที่เข้าใจง่ายขึ้น การใช้งานหลักคือการแยกส่วนตรรกะที่ซับซ้อนออกมาเป็นบล็อกที่สามารถเรียกใช้ได้หลายครั้ง
โครงสร้างพื้นฐานของ CTE (Syntax)
การสร้าง CTE จะต้องเริ่มต้นด้วยคำสำคัญ WITH เสมอ ตามด้วยชื่อ CTE และนิยามของ Query ที่อยู่ในวงเล็บ
SQL
WITH department_avg AS ( -- นี่คือการนิยาม CTE ชื่อ department_avg SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id) -- Query หลักที่ใช้ CTE SELECT e.name, e.salary, da.avg_salary FROM employees e JOIN department_avg da ON e.department_id = da.department_id WHERE e.salary > da.avg_salary;
🚀 ทำไมต้องใช้ CTE? (ข้อได้เปรียบหลัก)
การใช้ CTE ไม่เพียงแต่ทำให้โค้ดดูสะอาดตาขึ้นเท่านั้น แต่ยังเพิ่มขีดความสามารถในการจัดการข้อมูลที่ซับซ้อนได้ด้วย:
- Readability (ความอ่านง่าย): แทนที่จะมี Subquery ซ้อนกัน 5 ชั้น คุณสามารถแยกแต่ละส่วนออกมาเป็น CTE ทำให้โค้ดมีลำดับการทำงานที่ชัดเจน
- Reusability (การใช้ซ้ำ): คุณสามารถอ้างอิง CTE เดิมซ้ำได้หลายครั้งภายใน Query เดียวกัน ซึ่งช่วยลดความซ้ำซ้อนของโค้ด
- Recursion (การเรียกซ้ำ): นี่คือจุดเด่นที่สำคัญที่สุด CTE สามารถใช้สร้าง Recursive CTE ซึ่งจำเป็นอย่างยิ่งในการจัดการข้อมูลที่มีโครงสร้างเป็นลำดับชั้น (Hierarchy) เช่น ผังองค์กร (Organizational Chart) หรือโครงสร้างรายการสินค้า
🔗 การใช้งานขั้นสูง: Recursive CTE
เมื่อข้อมูลมีความสัมพันธ์เป็นลำดับชั้น (Parent-Child Relationship) การใช้ Subquery ทั่วไปจะทำได้ยาก แต่ Recursive CTE สามารถจัดการการเรียกตัวเอง (Self-referencing) ได้อย่างมีประสิทธิภาพ
ตัวอย่างการหาลำดับชั้นพนักงาน (Employee Hierarchy) ใน PostgreSQL:
SQL
WITH RECURSIVE org_chart AS ( -- Anchor Member (จุดเริ่มต้น) SELECT employee_id, name, manager_id, 0 AS level FROM employees WHERE manager_id IS NULL UNION ALL -- Recursive Member (ส่วนที่เรียกซ้ำ) SELECT e.employee_id, e.name, e.manager_id, o.level + 1 FROM employees e JOIN org_chart o ON e.manager_id = o.employee_id) SELECT * FROM org_chart ORDER BY level, employee_id;
✅ บทสรุป
Common Table Expressions (CTE) เป็นเครื่องมือที่ทรงพลังอย่างยิ่งสำหรับนักพัฒนา PostgreSQL ที่ต้องการเขียน Query ที่ซับซ้อนให้มีประสิทธิภาพและอ่านง่ายขึ้น ไม่ว่าจะเป็นการคำนวณค่าเฉลี่ย การจัดกลุ่มข้อมูล หรือการไล่ลำดับชั้นข้อมูลด้วย Recursive CTE การทำความเข้าใจ CTE จะยกระดับทักษะการเขียน SQL ของคุณให้ก้าวหน้าไปอีกขั้น