LeetCode. Database. Masala #1 (*easy)
Assalomu alaykum, ushbu postda quyidagi havola ostidagi masala yechimini ko'rsatib o'tmoqchiman.
ProblemFromLeetCode (darajasi : Oson)
Masala matni
Masala shartiga ko'ra Person jadvalida inson haqida malumotlar saqlangan va quyidagi(1 rasmga qarang) ustunlarga ega shuningdek,“personId” nomli ustun shu jadval uchun Primary Key vazifasini o'taydi. Xuddi shunga o'xshash Address nomli jadvalda insonlarning manzillari va ko'chalari haqidagi malumot saqlangan va bu jadvalda esa “addressId” nomli ustun Primary Key vazifasini o'taydi. Biz natijada Person jadvalidagi har bir inson uchun “firstName”, “lastName”, “city”, “state” malumotlarini o'z ichiga olgan jadval chop qilishimiz kerak, bunda agar insonnnig Person jadvalidagi “personId” malumoti Address jadvalining “PersonId ” ustunida uchrasa ushbu jadvaldan shu insonga mos “city” va “state” malumotlarini chop qilish ask holda “null” ni chop qilinishi zarur.
1 - rasm
Person Address
+-------------+---------+ +-------------+---------+
| Column Name | Type | | Column Name | Type |
+-------------+---------+ +-------------+---------+
| personId | int | | addressId | int |
| lastName | varchar | | personId | int |
| firstName | varchar | | city | varchar |
+-------------+---------+ | state | varchar |
+-------------+-------+
Masalan jadvallarimizda mos ravishda quyidagi malumotlar o'rin olgan bo'lsin.
Person jadvali:
+----------+----------+-----------+
| personId | lastName | firstName |
+----------+----------+-----------+
| 1 | Wang | Allen |
| 2 | Alice | Bob |
+----------+----------+-----------+
Address jadvali:
+-----------+----------+---------------+------------+
| addressId | personId | city | state |
+-----------+----------+---------------+------------+
| 1 | 2 | New York City | New York |
| 2 | 3 | Leetcode | California |
+-----------+----------+---------------+------------+
Natija esa:
+-----------+----------+---------------+----------+
| firstName | lastName | city | state |
+-----------+----------+---------------+----------+
| Allen | Wang | Null | Null |
| Bob | Alice | New York City | New York |
+-----------+----------+---------------+----------+
Qisqacha tushuntirsam, sezganingizdek Bob ismli insonning “personId” malumoti 2 va bu Address jadvalining “personId” ustunida uchraydi, shu sababli “city” va “state” ustunlarida mos ravishda "New York City" va "New York" malumotlar o'rin olgan. Endi Allen ismli insonga kelsak uning “personId” malumoti(1) Address jadvalida ifodalanmagan shu sababli “city”
va “state” ustunlaridagi malumotlar "null".
Masala yechimi:
Biz bu masala yechimini PostgreSql tilida yozamiz. Keling jadvallarni qo'shishning Left Join usulidan foydalasak, Masala yechimi quyidagicha:
SELECT
p.firstName,
p.lastName,
add.city,
add.state
FROM
Person p
LEFT JOIN Address add ON add.personId = p.personId
Endi tahlilga o'tsak. Nega Left Join? Sababi shundaki masala shartiga ko'ra, Person jadvalidagi har bir qator uchun natija jadvalida qator mavjud bo'lishi kerak yani hech bir inson natija jadvalida chiqmay qolmaslikigi shart. Left Join jadval qo'shish amali aynan shunday vazifani bajaradi, yuqoridagi yechimda Person jadvalining har bir qatoriga Address jadvalinig shunga mos malumotlarini moslab qo'yadi (ON add.personId = p.personId), agarda topilmasa “null” yozadi. Endi esa ketma ketlikda select qilish qoldi xolos. Shu bilan masala yechimi tugadi.
Natija:
Post muallifidan qisqacha:
Bu mening birinchi postim ekanini hisobga olib, kaminaning xato kamchiliklarini kechirib qo'yasiz degan umiddaman. Masala yechimi bo'yicha fikr, savol yokida yaxshiroq yechimlaringiz bo'lsa izohlarda qoldirishingingiz mumkin, albatta javob berishga harakat qilaman. Bizdan yaxshiroq yechim topganlarning yechim va usullarini o'rganuvchilardanmiz. © Doniyor Ismoilov