Exam-ready answer with definition, need, syntax, example, SQL query, output, explanation, and conclusion.
সেলফ জয়েন বলতে কী বোঝো? একটি উদাহরণ দাও যেখানে সেলফ জয়েন এর প্রয়োজনীয়তা আছে।
SQL-এ JOIN সাধারণত দুই বা তার বেশি table-এর মধ্যে সম্পর্কযুক্ত data বের করার জন্য ব্যবহার করা হয়। কিন্তু কখনও কখনও এমন পরিস্থিতি হয় যেখানে একটি table-এর data একই table-এর অন্য rows-এর সঙ্গে compare করতে হয়। এই ধরনের ক্ষেত্রে Self Join ব্যবহার করা হয়।
Self Join হলো এমন একটি join যেখানে একটি table-কে নিজের সঙ্গেই join করা হয়। অর্থাৎ একই table-কে query-তে দুইবার ব্যবহার করা হয়, কিন্তু আলাদা alias name দিয়ে table-টিকে দুইটি আলাদা table-এর মতো treat করা হয়।
সহজ ভাষায়: একই table-এর row-গুলির মধ্যে relationship খুঁজে বের করার জন্য যখন table-টি নিজের সঙ্গেই join করা হয়, তখন তাকে Self Join বলা হয়।
Self Join হলো SQL-এর একটি technique, যেখানে একই table-কে নিজের সঙ্গেই join করা হয় যাতে একই table-এর rows-এর মধ্যে সম্পর্ক বা comparison দেখানো যায়।
Definition: A self join is a join in which a table is joined with itself by using different aliases for the same table.
Self Join আলাদা কোনো নতুন join type নয়। এটি সাধারণত INNER JOIN, LEFT JOIN বা অন্য join ব্যবহার করেই করা হয়। শুধু একই table-কে দুইবার alias দিয়ে ব্যবহার করা হয়।
Self Join করার সময় একই table query-তে দুইবার ব্যবহার করা হয়। তাই SQL engine বুঝতে পারে না কোন column table-এর কোন copy থেকে নেওয়া হচ্ছে। এই ambiguity দূর করার জন্য table alias ব্যবহার করা হয়।
যেমন, Employee table-কে দুইবার ব্যবহার করলে আমরা alias দিতে পারি:
Employee AS E
Employee AS M
এখানে E employee-এর জন্য এবং M manager-এর জন্য ব্যবহার করা হয়েছে।
SELECT A.column_name, B.column_name
FROM table_name AS A
JOIN table_name AS B
ON A.common_column = B.related_column;
এখানে একই table A এবং B নামে দুইটি alias দিয়ে ব্যবহার করা হয়েছে। তারপর ON condition-এর মাধ্যমে একই table-এর দুইটি row-এর মধ্যে relationship তৈরি করা হয়েছে।
Self Join তখন দরকার হয় যখন একই table-এর মধ্যে থাকা records-এর মধ্যে relationship থাকে। অর্থাৎ table-এর একটি row অন্য row-এর সঙ্গে সম্পর্কযুক্ত হলে Self Join ব্যবহার করা হয়।
Exam Point: Self Join-এর সবচেয়ে common example হলো Employee table, যেখানে employee এবং manager দুজনই একই table-এ থাকে।
ধরা যাক, একটি company-এর Employee table আছে। এই table-এ employee-এর তথ্য এবং তার manager-এর ID সংরক্ষিত আছে। যেহেতু manager নিজেও একজন employee, তাই manager-এর record-ও একই Employee table-এ থাকে।
তাই employee-এর নাম এবং তার manager-এর নাম একসঙ্গে বের করার জন্য Self Join প্রয়োজন।
| Emp_ID | Emp_Name | Designation | Manager_ID |
|---|---|---|---|
| 1 | Rahul | CEO | NULL |
| 2 | Riya | Manager | 1 |
| 3 | Karim | Developer | 2 |
| 4 | Anita | Tester | 2 |
| 5 | Suman | Developer | 2 |
এখানে Manager_ID column একই table-এর Emp_ID-কে refer করছে। অর্থাৎ কোন employee কার অধীনে কাজ করছে তা Manager_ID দিয়ে বোঝানো হয়েছে।
Employee-এর নাম এবং manager-এর নাম বের করার query:
SELECT
E.Emp_Name AS Employee_Name,
M.Emp_Name AS Manager_Name
FROM Employee AS E
JOIN Employee AS M
ON E.Manager_ID = M.Emp_ID;
এখানে Employee table-কে দুইবার ব্যবহার করা হয়েছে:
| Employee_Name | Manager_Name |
|---|---|
| Riya | Rahul |
| Karim | Riya |
| Anita | Riya |
| Suman | Riya |
এখানে দেখা যাচ্ছে Riya-এর manager Rahul এবং Karim, Anita ও Suman-এর manager Riya।
Rahul-এর Manager_ID NULL, তাই INNER JOIN result-এ Rahul আসেনি। কারণ Rahul-এর কোনো manager নেই।
যদি আমরা এমন employee-কেও দেখতে চাই যার manager নেই, তাহলে LEFT JOIN ব্যবহার করা যায়।
SELECT
E.Emp_Name AS Employee_Name,
M.Emp_Name AS Manager_Name
FROM Employee AS E
LEFT JOIN Employee AS M
ON E.Manager_ID = M.Emp_ID;
| Employee_Name | Manager_Name |
|---|---|
| Rahul | NULL |
| Riya | Rahul |
| Karim | Riya |
| Anita | Riya |
| Suman | Riya |
এখানে Rahul-এর manager নেই, তাই Manager_Name column-এ NULL এসেছে।
| Query Part | Explanation |
|---|---|
| Employee AS E | Employee table-এর প্রথম copy, যা employee information বোঝায়। |
| Employee AS M | Employee table-এর দ্বিতীয় copy, যা manager information বোঝায়। |
| E.Manager_ID = M.Emp_ID | Employee-এর Manager_ID manager-এর Emp_ID-এর সঙ্গে match করা হয়। |
| E.Emp_Name | Employee-এর নাম দেখায়। |
| M.Emp_Name | Manager-এর নাম দেখায়। |
| Use Case | Explanation |
|---|---|
| Employee-Manager | একই Employee table থেকে employee এবং manager-এর নাম বের করা। |
| Category-Subcategory | একই Category table থেকে parent category এবং child category বের করা। |
| Duplicate Checking | একই table-এর rows compare করে duplicate data খুঁজে বের করা। |
| Student Pairing | একই class-এর students-এর pair তৈরি করা। |
| Product Comparison | একই Product table-এর products-এর price compare করা। |
একই table-এর মধ্যে একই email থাকা students খুঁজতে Self Join ব্যবহার করা যেতে পারে।
SELECT
S1.Student_ID,
S1.Student_Name,
S1.Email
FROM Student AS S1
JOIN Student AS S2
ON S1.Email = S2.Email
AND S1.Student_ID <> S2.Student_ID;
এখানে একই email আছে কিন্তু Student_ID আলাদা — এমন records বের করা হয়েছে।
| Join Type | Result | Example Use |
|---|---|---|
| INNER JOIN | শুধুমাত্র matching records দেখায় | যেসব employee-এর manager আছে তাদের দেখানো |
| LEFT JOIN | left table-এর সব records দেখায়, match না থাকলে NULL দেখায় | CEO সহ সব employee দেখানো |
সুতরাং, Self Join হলো SQL-এর একটি গুরুত্বপূর্ণ technique, যেখানে একটি table-কে নিজের সঙ্গেই join করা হয়। এটি তখন ব্যবহার করা হয় যখন একই table-এর rows-এর মধ্যে relationship থাকে।
Employee-Manager relationship, parent-child category, duplicate checking এবং row comparison-এর মতো ক্ষেত্রে Self Join অত্যন্ত কার্যকর। Self Join করার সময় table aliases ব্যবহার করা খুব গুরুত্বপূর্ণ, কারণ একই table query-তে একাধিকবার ব্যবহৃত হয়।