Artikel ini memberikan gambaran umum tentang self join di SQL, serta contoh dasarnya.
Apa itu Self Join?
SQL SELF JOIN
bergabung dengan tabel untuk dirinya sendiri. Ini dapat berguna untuk membuat kueri data hierarki dalam tabel yang sama, atau untuk membandingkan baris dalam tabel yang sama.
Contoh 1 – Gabung Kiri Sendiri
Contoh klasik dari self join ada di tabel Employee. Dalam tabel seperti itu, satu karyawan mungkin melapor ke karyawan lain. Oleh karena itu, Anda dapat menggunakan self join untuk bergabung dengan tabel pada kolom ID karyawan dan kolom ID manajer.
Misalkan kita memiliki tabel berikut:
+--------------+-------------+------------+-------------+ | EmployeeId | FirstName | LastName | ReportsTo | |--------------+-------------+------------+-------------| | 1 | Homer | Connery | NULL | | 2 | Bart | Pitt | 1 | | 3 | Maggie | Griffin | 1 | | 4 | Peter | Farnsworth | 2 | | 5 | Marge | Morrison | NULL | | 6 | Lisa | Batch | 5 | | 7 | Dave | Zuckerberg | 6 | | 8 | Vlad | Cook | 7 | +--------------+-------------+------------+-------------+
Kita bisa melakukan self left join di tabel ini untuk mengembalikan semua karyawan dan manajernya.
SELECT
CONCAT(e1.FirstName, ' ', e1.LastName) AS Employee,
CONCAT(e2.FirstName, ' ', e2.LastName) AS Manager
FROM Employees e1
LEFT JOIN Employees e2
ON e1.ReportsTo = e2.EmployeeId;
Hasil:
+------------------+-----------------+ | Employee | Manager | |------------------+-----------------| | Homer Connery | | | Bart Pitt | Homer Connery | | Maggie Griffin | Homer Connery | | Peter Farnsworth | Bart Pitt | | Marge Morrison | | | Lisa Batch | Marge Morrison | | Dave Zuckerberg | Lisa Batch | | Vlad Cook | Dave Zuckerberg | +------------------+-----------------+
Homer Connery dan Marge Morrison tidak melapor kepada siapa pun dan begitu pula Manager
mereka bidang kosong. Sebenarnya, itu akan menjadi NULL
jika saya tidak melakukan penggabungan string pada dua kolom.
Contoh 2 – Self Inner Join
Jika kita tidak ingin kedua head honchos dikembalikan, maka kita bisa melakukan inner join di atas meja. Ini akan menghilangkan setiap baris yang tidak memiliki kecocokan di kedua tabel (yaitu karyawan yang tidak memiliki manajer yang sesuai dan sebaliknya).
SELECT
CONCAT(e1.FirstName, ' ', e1.LastName) AS Employee,
CONCAT(e2.FirstName, ' ', e2.LastName) AS Manager
FROM Employees e1
INNER JOIN Employees e2
ON e1.ReportsTo = e2.EmployeeId;
Hasil:
+------------------+-----------------+ | Employee | Manager | |------------------+-----------------| | Bart Pitt | Homer Connery | | Maggie Griffin | Homer Connery | | Peter Farnsworth | Bart Pitt | | Lisa Batch | Marge Morrison | | Dave Zuckerberg | Lisa Batch | | Vlad Cook | Dave Zuckerberg | +------------------+-----------------+
Contoh 3 – Bergabung dengan Hak Sendiri
Jika kita ingin melakukan self-right join, kita perlu mengacak beberapa kolom di dalam kueri.
SELECT
CONCAT(e1.FirstName, ' ', e1.LastName) AS Manager,
CONCAT(e2.FirstName, ' ', e2.LastName) AS Employee
FROM Employees e1
RIGHT JOIN Employees e2
ON e1.EmployeeId = e2.ReportsTo;
Hasil:
+-----------------+------------------+ | Manager | Employee | |-----------------+------------------| | | Homer Connery | | Homer Connery | Bart Pitt | | Homer Connery | Maggie Griffin | | Bart Pitt | Peter Farnsworth | | | Marge Morrison | | Marge Morrison | Lisa Batch | | Lisa Batch | Dave Zuckerberg | | Dave Zuckerberg | Vlad Cook | +-----------------+------------------+