Bosh sahifa Wiki FULL OUTER JOIN

FULL OUTER JOIN

FULL OUTER JOIN — ikki relationdagi mos satrlarni birlashtirib, mos jufti yo‘q chap va o‘ng satrlarni ham natijada saqlaydigan SQL operatori. Mos bo‘lmagan tomondan olingan ustunlar NULL bilan to‘ldiriladi. Bu ikki ma’lumot to‘plamini solishtirish va farqlarini topishda foydali.

Natija tarkibi

Quyidagi so‘rov eski va yangi katalogdagi yozuvlarni kod bo‘yicha taqqoslaydi:

SELECT
    COALESCE(o.code, n.code) AS code,
    o.price AS old_price,
    n.price AS new_price
FROM old_catalog AS o
FULL OUTER JOIN new_catalog AS n
    ON n.code = o.code;

Kod ikkala tomonda mavjud bo‘lsa qiymatlar bitta qatorga birlashadi. Faqat eski katalogda bo‘lsa yangi ustunlar, faqat yangi katalogda bo‘lsa eski ustunlar null bo‘ladi. COALESCE mavjud kalitni yagona output ustuniga chiqaradi.

FULL OUTER JOINni uch qismning birlashmasi sifatida tushunish mumkin: INNER JOINdagi moslar, chap tomondagi mos bo‘lmaganlar va o‘ng tomondagi mos bo‘lmaganlar. Biroq database buni aynan uchta alohida operatsiya sifatida bajarishi shart emas.

Farqlarni aniqlash

Reconciliation jarayonida qator holatini CASE bilan belgilash mumkin:

CASE
  WHEN o.code IS NULL THEN 'faqat yangi'
  WHEN n.code IS NULL THEN 'faqat eski'
  WHEN o.price IS DISTINCT FROM n.price THEN 'o‘zgargan'
  ELSE 'bir xil'
END

Tekshirilayotgan kalit ikkala jadvalda NOT NULL bo‘lishi ma’qul. Nullable kalitda “mos satr yo‘q” va “mos satr bor, kaliti null” holatlari chalkashadi. Oddiy <> ham null qiymatlarni farq sifatida tutmaydi; mahsulot qo‘llasa IS DISTINCT FROM null-safe comparison beradi.

Duplicate kalitlar

Ikkala tomonda kalit noyob bo‘lmasa, barcha mos kombinatsiyalar hosil bo‘ladi. Ikki eski va uch yangi satr bir kalitga ega bo‘lsa oltita mos qator chiqadi. Reconciliationdan oldin uniqueness constraint yoki alohida duplicate audit zarur. Aks holda full join farqni ko‘rsatish o‘rniga natijani ko‘paytiradi.

Filtrlash

WHERE bandida bitta tomon ustuniga oddiy shart qo‘yish o‘sha tomoni yo‘q qatorlarni chiqarib tashlashi mumkin. Masalan, WHERE n.active = true faqat eski tomonda mavjud qatorlarni saqlamaydi. Kerakli semantika ON, nullni hisobga oladigan WHERE yoki alohida subquery bilan aniq yoziladi.

Faqat nomosliklarni olish uchun WHERE o.key IS NULL OR n.key IS NULL ishlatiladi. Qiymati o‘zgargan mos satrlarni ham qo‘shish kerak bo‘lsa, ustunlar null-safe tarzda solishtiriladi.

Qo‘llab-quvvatlash va performance

Ba’zi database tizimlari, jumladan ayrim MySQL versiyalari, native FULL OUTER JOIN sintaksisini bermaydi. Uni LEFT JOIN natijasi bilan faqat o‘ngda qolgan satrlarni UNION ALL orqali qo‘shib emulyatsiya qilish mumkin. Duplicate semantikasi noto‘g‘ri bo‘lmasligi uchun ikkinchi qismda ishonchli null tekshiruvi ishlatiladi.

Katta jadvallarda full join ikkala tomonni ham keng o‘qishi, hash jadval yoki sort uchun katta xotira talab qilishi mumkin. Sana, partition yoki biznes kaliti bo‘yicha hajmni oldindan cheklash, mos index va yangilangan statistika yordam beradi. Reconciliation natijasidagi qatorlar soni hamda faqat-chap, faqat-o‘ng va o‘zgargan kategoriyalar alohida sanaladi.

Taqqoslash yakunida nazorat summasi va kategoriya hisoblari audit dalili sifatida saqlanishi mumkin.

Bog‘liq tushunchalar

Outer join, LEFT JOIN, INNER JOIN, UNION ALL, Reconciliation, NULL, COALESCE, Join predicate