SELF JOIN হলো একই টেবিলকে দুবার আলিয়াস (alias) দিয়ে নিজের সাথে জয়ন করা।
উদাহরণ দিয়ে বুঝি
টেবিল তৈরি করুন:
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)
রেকর্ড ইনসার্ট করুন:
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');
সকল রেকর্ড:
mysql> SELECT * FROM SelfJoinDemo;
+----+-------------+-------------+------+
| 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 |
+----+-------------+-------------+------+
7 rows in set (0.00 sec)
SELF JOIN কোয়েরি
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 |
+-------------+------+
1 row in set (0.00 sec)
ব্যাখ্যা: টেবিলকে t1 এবং t2 алиয়াস দিয়ে দুবার রেফারেন্স করা হয়েছে। WHERE t1.Year = t2.Year দিয়ে একই বছরের রোগুলো ম্যাচ করা হয়েছে। DISTINCT ডুপ্লিকেট রো বাদ দিয়েছে।
SELF JOIN-এর সাধারণ ব্যবহার
- হায়ারার্কিক্যাল ডেটা (Employee-Manager)
- একই টেবিলের রো তুলনা (যেমন: একই বছরে ভিন্ন দেশ)
- প্যারেন্ট-চাইল্ড রিলেশনশিপ (Category-Subcategory)
আধুনিক সিনট্যাক্স (JOIN কীওয়ার্ড)
SELECT DISTINCT t1.CountryName, t2.Year
FROM SelfJoinDemo t1
JOIN SelfJoinDemo t2 ON t1.Year = t2.Year
WHERE t1.CountryName = 'US';