SELF JOIN คือการ JOIN ตารางกับตัวเอง โดยใช้ Alias (t1, t2) เพื่อเปรียบเทียบแถวภายในตารางเดียวกัน
ตัวอย่างการใช้งาน
สร้างตาราง:
mysql> create table SelfJoinDemo (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> CountryName varchar(20),
-> CountryRank int,
-> `Year` varchar(10)
-> );
Query OK, 0 rows affected (1.02 sec)
เพิ่มข้อมูล (มี UK ซ้ำ 2 ปี):
mysql> insert into SelfJoinDemo(CountryName,CountryRank,`Year`) values('US',1,'2016');
mysql> insert into SelfJoinDemo(CountryName,CountryRank,`Year`) values('UK',5,'2013');
mysql> insert into SelfJoinDemo(CountryName,CountryRank,`Year`) values('France',45,'2010');
mysql> insert into SelfJoinDemo(CountryName,CountryRank,`Year`) values('Turkey',3,'2000');
mysql> insert into SelfJoinDemo(CountryName,CountryRank,`Year`) values('Japan',78,'1995');
mysql> insert into SelfJoinDemo(CountryName,CountryRank,`Year`) values('Romania',110,'2007');
mysql> insert into SelfJoinDemo(CountryName,CountryRank,`Year`) values('UK',3,'2000');
ข้อมูล:
+----+-------------+-------------+------+ | Id | CountryName | CountryRank | Year | +----+-------------+-------------+------+ | 1 | US | 1 | 2016 | | 2 | UK | 5 | 2013 | | 3 | France | 45 | 2010 | | 4 | Turkey | 3 | 2000 | | 5 | Japan | 78 | 1995 | | 6 | Romania | 110 | 2007 | | 7 | UK | 3 | 2000 | +----+-------------+-------------+------+
SELF JOIN: หาปีของ US แล้วดูประเทศอื่นในปีเดียวกัน:
mysql> SELECT DISTINCT t1.CountryName, t2.Year
-> FROM SelfJoinDemo AS t1, SelfJoinDemo AS t2
-> WHERE t1.Year = t2.Year AND t1.CountryName = 'US';
ผลลัพธ์:
+-------------+------+ | CountryName | Year | +-------------+------+ | US | 2016 | +-------------+------+
เพราะ US มีแค่ปี 2016 ไม่มีประเทศอื่นในปี 2016
กรณีใช้งานจริง
- Hierarchical data (Employee-Manager)
- เปรียบเทียบแถวในตารางเดียวกัน (เช่น หาคู่ที่มีค่าใกล้เคียง)
- หาข้อมูลซ้ำ (Duplicates)