PlusMagi's Blog By Pitt Phunsanit Database Database: Common Table Expressions (CTE)

Database: Common Table Expressions (CTE)

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 ของคุณให้ก้าวหน้าไปอีกขั้น