Self Join เป็นการทำ Join ตารางกับตัวเองเพื่อดึงข้อมูลที่ต้องการออกมา ซึ่งในกรณีนี้เราจะใช้ Self Join เมื่อเราต้องการเปรียบเทียบหรือจับคู่ข้อมูลระหว่างแถวในตารางเดียวกัน
โดยทั่วไป Self Join มักจะใช้ในกรณีที่เราต้องการหาความสัมพันธ์บางอย่างในข้อมูล เช่น โครงสร้างลำดับชั้น (Hierarchy), การเปรียบเทียบระหว่างพนักงานที่เป็นหัวหน้าและลูกน้อง, หรือการจับคู่ข้อมูลที่มีความเกี่ยวข้องกันในตารางเดียว
ขั้นตอนการใช้งาน Self Join
- เราต้องสร้าง Alias ให้กับตารางของเรา เพื่อให้เราสามารถแยกแยะแถวที่มาจากตารางเดียวกันได้
- จากนั้นเราจะทำการ Join ตามเงื่อนไขที่เราต้องการ เช่นการเปรียบเทียบข้อมูลในแถวเดียวกันหรือระหว่างแถวที่แตกต่างกัน
สร้างตารางตัวอย่าง
สมมติว่าเรามีตารางชื่อ employees ที่เก็บข้อมูลพนักงานดังนี้
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
employee_name VARCHAR(100),
manager_id INT
);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 ในการเชื่อมโยงพนักงานกับผู้จัดการของเขา
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สำหรับพนักงาน และ Aliasmแทนตารางเดียวกันแต่สำหรับผู้จัดการ - เราใช้
LEFT JOINเพื่อให้สามารถดึงพนักงานทุกคนออกมา แม้ว่าพนักงานบางคนจะไม่มีผู้จัดการ (เช่น John)
ผลลัพธ์

การหาพนักงานที่มีผู้จัดการเดียวกัน
หากเราต้องการค้นหาว่าพนักงานคนไหนบ้างที่มีผู้จัดการเดียวกัน เราสามารถใช้ Self Join โดยกำหนดเงื่อนไขให้ manager_id ตรงกัน
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 แบบนี้
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 สำหรับการทำงานกับข้อมูลในตารางเดียวกันเมื่อเราต้องการเปรียบเทียบหรือหาความสัมพันธ์ระหว่างแถว ตัวอย่างเช่น การหาโครงสร้างลำดับชั้น (เช่นพนักงานและผู้จัดการ) หรือการจับคู่ข้อมูลที่มีความสัมพันธ์กัน
