SQL การใช้งาน Self Join

Self Join เป็นการทำ Join ตารางกับตัวเองเพื่อดึงข้อมูลที่ต้องการออกมา ซึ่งในกรณีนี้เราจะใช้ Self Join เมื่อเราต้องการเปรียบเทียบหรือจับคู่ข้อมูลระหว่างแถวในตารางเดียวกัน

โดยทั่วไป Self Join มักจะใช้ในกรณีที่เราต้องการหาความสัมพันธ์บางอย่างในข้อมูล เช่น โครงสร้างลำดับชั้น (Hierarchy), การเปรียบเทียบระหว่างพนักงานที่เป็นหัวหน้าและลูกน้อง, หรือการจับคู่ข้อมูลที่มีความเกี่ยวข้องกันในตารางเดียว

ขั้นตอนการใช้งาน Self Join

  1. เราต้องสร้าง Alias ให้กับตารางของเรา เพื่อให้เราสามารถแยกแยะแถวที่มาจากตารางเดียวกันได้
  2. จากนั้นเราจะทำการ Join ตามเงื่อนไขที่เราต้องการ เช่นการเปรียบเทียบข้อมูลในแถวเดียวกันหรือระหว่างแถวที่แตกต่างกัน

สร้างตารางตัวอย่าง

สมมติว่าเรามีตารางชื่อ employees ที่เก็บข้อมูลพนักงานดังนี้

SQL
CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    employee_name VARCHAR(100),
    manager_id INT
);
SQL
INSERT INTO employees (employee_id, employee_name, manager_id)
VALUES
(1, 'John', NULL),
(2, 'Alice', 1),
(3, 'Bob', 1),
(4, 'Carol', 2),
(5, 'Dave', 2);

ข้อมูลภายในตารางจะเป็นดังนี้

ตัวอย่างการใช้งาน Self Join

การหาพนักงานและผู้จัดการของพนักงาน

ในกรณีนี้ เราต้องการหาว่าแต่ละพนักงานมีใครเป็นผู้จัดการ เราจะใช้ Self Join โดยใช้ manager_id ในการเชื่อมโยงพนักงานกับผู้จัดการของเขา

SQL
SELECT e.employee_name AS Employee, m.employee_name AS Manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id;
  • เราใช้ Alias e แทนตาราง employees สำหรับพนักงาน และ Alias m แทนตารางเดียวกันแต่สำหรับผู้จัดการ
  • เราใช้ LEFT JOIN เพื่อให้สามารถดึงพนักงานทุกคนออกมา แม้ว่าพนักงานบางคนจะไม่มีผู้จัดการ (เช่น John)

ผลลัพธ์

การหาพนักงานที่มีผู้จัดการเดียวกัน

หากเราต้องการค้นหาว่าพนักงานคนไหนบ้างที่มีผู้จัดการเดียวกัน เราสามารถใช้ Self Join โดยกำหนดเงื่อนไขให้ manager_id ตรงกัน

SQL
SELECT e1.employee_name AS Employee1, e2.employee_name AS Employee2, e1.manager_id
FROM employees e1
JOIN employees e2 ON e1.manager_id = e2.manager_id
WHERE e1.employee_id != e2.employee_id;
  • เราใช้ Alias e1 และ e2 แทนพนักงานทั้งสองคน และ Join ตารางเดียวกันโดยใช้ manager_id
  • เราใช้ WHERE e1.employee_id != e2.employee_id เพื่อให้ไม่จับคู่พนักงานกับตัวเอง

ผลลัพธ์

การหาพนักงานระดับล่างสุดในลำดับชั้น

หากเราต้องการหาพนักงานที่ไม่ได้เป็นผู้จัดการของใครเลย สามารถใช้การ Self Join แบบนี้

SQL
SELECT e.employee_name
FROM employees e
LEFT JOIN employees m ON e.employee_id = m.manager_id
WHERE m.manager_id IS NULL;
  • เราใช้ LEFT JOIN เพื่อตรวจสอบว่าพนักงานคนไหนไม่มีใครที่มี manager_id เป็นพนักงานคนนั้น
  • เงื่อนไข WHERE m.manager_id IS NULL คือการตรวจสอบว่าพนักงานคนนั้นไม่ได้เป็นผู้จัดการของใครเลย

ผลลัพธ์

สรุป

Self Join เป็นเครื่องมือที่มีประโยชน์ใน SQL สำหรับการทำงานกับข้อมูลในตารางเดียวกันเมื่อเราต้องการเปรียบเทียบหรือหาความสัมพันธ์ระหว่างแถว ตัวอย่างเช่น การหาโครงสร้างลำดับชั้น (เช่นพนักงานและผู้จัดการ) หรือการจับคู่ข้อมูลที่มีความสัมพันธ์กัน

แชร์เรื่องนี้