آموزش Self Join در SQL

sql self join guide
20 آبان 1403

سلام! امروز می‌خواهیم در مورد Self Join در SQL صحبت کنیم. احتمالاً درباره JOIN های مختلف مثل INNER JOIN و OUTER JOIN شنیدین. اما Self Join یک نوع خاص از JOIN هست که به شما اجازه می‌ده تا یک جدول رو به خودش متصل کنید. این مورد زمانی استفاده میشه که اطلاعاتی درون یک جدول داریم که به هم مرتبطند و می‌خواهیم این روابط رو درون همان جدول نگه داریم.

فرض کنید یک جدول 'کارمندان' داریم که هر کارمند ممکنه یک سرپرست داشته باشه که باز هم خودش یک کارمند این شرکته. در این شرایط، برای به دست آوردن اطلاعاتی مثل اینکه چه کسی تحت سرپرستی چه کسی هست، نیاز به Self Join داریم. انعطاف‌پذیری و قدرتی که SQL به ما میده به ما اجازه میده اینگونه داده‌ها رو به سادگی واکشی کنیم.

باید به این نکته توجه کنید که در Self Join، علائم متمایز کننده‌ای مثل نام مستعار (Alias) برای جداول استفاده می‌کنیم تا از تداخل داده‌ها و ستون‌ها جلوگیری کنیم. به بیان ساده‌تر، فرض کنید از یک جدول دو نسخه موقت می‌سازیم که یکی اطلاعات کارمندان و دیگری اطلاعات سرپرستان رو نگهداری می‌کنه.

حالا یک مثال عملی از Self Join می‌آریم تا این مفهوم رو کامل برای شما روشن کنیم. فرض كنيد يك جدول به اسم 'employees' داريم كه ستون‌هايي شامل 'id'، 'name'، و 'manager_id' داره. 'manager_id' در واقع همون 'id' سرپرسته.


SELECT e1.name AS Employee, e2.name AS Manager
FROM employees e1
JOIN employees e2 ON e1.manager_id = e2.id;

در مثالی که بالا می‌بینید:

  • خط اول نام کارمند و نام سرپرست رو از جدول انتخاب می‌کنه.
  • از عبارت FROM employees e1 استفاده می‌کنیم تا جدول رو به خودش وصل کنیم و بهش یک نام مستعار 'e1' می‌دیم.
  • خط بعد، JOIN employees e2، جدول رو برای بار دوم وارد می‌کنه و بهش نام مستعار 'e2' میده، که همون جدول قبلی‌یه ولی برای مشخص کردن سرپرست.
  • دستور ON e1.manager_id = e2.id مشخص می‌کنه که چطور این دو جدول به هم وصل می‌شن؛ به طوری که 'manager_id' در 'e1' باید با 'id' در 'e2' مطابقت داشته باشه.

امیدوارم این توضیحات به شما کمک کنه تا Self Join رو بهتر درک کنید و بتونید از اون در پروژه‌های خودتون استفاده کنید.

سوالات متداول

؟

Self Join چه زمانی به کار میاد؟

؟

Self Join چه تفاوتی با دیگر JOIN ها داره؟

؟

چطور می‌تونم از تداخل نام ستون‌ها در Self Join جلوگیری کنم؟