Self join — bitta jadvalni so‘rov ichida ikki yoki undan ortiq mantiqiy nusxa sifatida o‘ziga bog‘lash usuli. SQLda buning uchun alohida SELF JOIN operatori yo‘q; oddiy JOIN ishlatiladi va har bir rolga boshqa alias beriladi.
Iyerarxik bog‘lanish
Xodim va uning bevosita rahbarini bitta employees jadvalidan olish:
SELECT
e.id,
e.name AS employee,
m.name AS manager
FROM employees AS e
LEFT JOIN employees AS m
ON m.id = e.manager_id;
e xodim, m rahbar rolini ifodalaydi. Yuqori darajadagi rahbarning manager_idsi null bo‘lishi mumkin, shu sabab LEFT JOIN barcha xodimlarni saqlaydi. Foreign key manager_id -> employees.id mavjud bo‘lmagan rahbarga havolani cheklaydi, ammo cycle paydo bo‘lishini har doim to‘liq to‘smaydi.
Self join faqat bitta darajani qulay ko‘rsatadi. Butun boshqaruv daraxtini noma’lum chuqurlikda yurish uchun recursive CTE mosroq. Recursive queryda cycle detection va maksimal chuqurlik nazorati kerak.
Juftlarni topish
Bir jadvaldagi elementlar orasidagi munosabatni topish uchun inner self join ishlatiladi. Masalan, ayni emailga ega duplicate foydalanuvchi juftlari:
SELECT a.id, b.id, a.email
FROM users AS a
JOIN users AS b
ON b.email = a.email
AND b.id > a.id;
b.id > a.id har juftni faqat bir marta chiqaradi va satrning o‘zi bilan bog‘lanishini cheklaydi. Bu shart bo‘lmasa (1,2) va (2,1) ikkala yo‘nalishda chiqadi, (1,1) ham paydo bo‘lishi mumkin. Duplicate aniqlashda case, whitespace, Unicode normalization va null semantikasi biznes qoidaga moslashtiriladi.
Vaqt oralig‘i va ketma-ketlik
Self join bir entityning oldingi yoki keyingi holatini topish uchun ishlatilishi mumkin. Ammo har satrga “eng yaqin oldingi” satrni topish murakkab predicate va anti-join talab qilishi mumkin. LAG yoki LEAD window funksiyalari ko‘pincha bu vazifani sodda va samarali ifodalaydi.
Vaqt intervallari ustma-ust tushishini aniqlashda jadval o‘ziga interval sharti bilan bog‘lanadi. Har bir juftni takrorlamaslik uchun noyob ID tartibi qo‘shiladi. Juda katta jadvalda range join qimmat bo‘lishi mumkin; vaqt bo‘yicha mos index, exclusion constraint yoki maxsus range tipi foyda beradi.
Alias va aniqlik
Har ustun qaysi rolga tegishli ekani alias bilan yoziladi. id, name kabi nomni qualifiersiz ishlatish ambiguous column xatosi yoki noto‘g‘ri mantiq keltiradi. Aliaslar a va bdan ko‘ra employee va manager kabi ma’noli bo‘lsa murakkab query osonroq o‘qiladi.
Self joinning har bir tomoni uchun filter semantikasi alohida ko‘riladi. LEFT JOINda o‘ng rol filterini WHEREga qo‘yish mos topilmagan chap qatorlarni olib tashlashi mumkin. Zarur shart ON ichida yoziladi.
Performance
Jadval fizik jihatdan avtomatik nusxalanmaydi, ammo plan bir manbaga ikki access path sifatida murojaat qiladi. Har rolning filter va join kalitiga mos indexlar baholanadi. Bir-to-many yoki duplicate kalitlar natijani kutilganidan ko‘p oshirishi mumkin. Query plandagi estimated va actual cardinality solishtiriladi, ayniqsa range yoki teng bo‘lmagan predicate ishlatilganda.
Bog‘liq tushunchalar
SQL JOIN, Table alias, Recursive CTE, Hierarchical data, Window function, Foreign key, Join predicate, Cycle detection