|
10-mavzu. Sqlda murakkab so’rovlar yaratish. Bir necha jadvallarni birlashtirish, ‘join’ lar bilan ishlash
|
bet | 8/12 | Sana | 24.11.2023 | Hajmi | 44,55 Kb. | | #105026 |
Bog'liq JSOONO'zaro birlashmalar. Jadval taxalluslaridan foydalanishning asosiy sabablaridan biri bitta SELECT iborasida bir jadvalga bir necha marta murojaat qilish imkoniyatidir. Buni misol bilan ko'rsatamiz.
Aytaylik, siz Jim Jons ishlaydigan kompaniyada ishlaydigan mijozlarning barcha aloqa manzillariga xat yubormoqchisiz. Bunday so'rov uchun siz birinchi navbatda Jim Jones qaysi kompaniya bilan ishlashini, keyin esa qaysi mijozlar bir kompaniya bilan ishlashini bilib olishingizni talab qiladi. Ushbu muammoni hal qilishning bir usuli quyida keltirilgan.
SELECT cust_id, cust_name, cust_contact FROM Customers WHERE cust_name = (SELECT cust_name FROM Customers WHERE cust_name = (SELECT cust_name FROM Customers WHERE cust_contact =`Jim Jones`)
Natija:
cust_id
|
cust_name
|
cust_contact
|
1000000003
1000000004
|
Fun4All Fun4All
|
Jim Jones
Denise L. Stephens
|
Birinchi yechim pastki so'rovlardan foydalanadi. Ichki SELECT iborasi Jim Jons ishlaydigan kompaniya nomini qaytaradi (cust_name). Aynan shu nom tashqi so'rovning WHERE bandida qo'llaniladi, bu kompaniyada ishlaydigan barcha xodimlarning ismlarini oladi. Endi xuddi shu so’rovni ichki birlashmalar bilan ko’rib chiqaylik:
SELECT cl.cust_id, cl.cust_name, cl.cust_contact FROM Customers AS cl, Customers AS c2 WHERE cl.cust_name = c2 .cust name AND c2.cust contact = 'Jim Jones';
So'rovni bajarish uchun zarur bo'lgan ikkita jadval aslida bir xil jadvaldir, shuning uchun Customers jadvali FROM bandida ikki marta paydo bo'ladi. Bu mutlaqo qonuniy bo'lsa-da, Products jadvaliga har qanday havolalar noaniq bo'ladi, chunki MBBT qaysi Customers jadvalini nazarda tutayotganingizni bilmaydi.
Taxalluslar ushbu muammoni hal qilish uchun yaratilgan. Birinchi marta c1 taxallus Customers jadvaliga, ikkinchi marta c2 taxallusi tayinlanadi. Endi bu taxalluslardan jadval nomlari sifatida foydalanish mumkin. Xususan, SELECT iborasi c1 prefiksidan foydalanib, kerakli ustunning to'liq nomini aniq ko'rsatib beradi. Agar bu bajarilmasa, MBBT xato xabarini yaratadi, chunki har biri cust_id, cust_name va cust_contact deb nomlangan ikkita ustun mavjud. MBBT qaysi ustunni nazarda tutayotganingizni bilishning hech qanday usuli yo'q (hatto u aslida bir xil ustun bo'lsa ham). Birinchi WHERE bandi jadvalning ikkala nusxasini birlashtiradi va keyin faqat kerakli ma'lumotlarni qaytarish uchun ikkinchi jadval ma'lumotlarini cust_contact ustunida filtrlaydi.
|
| |