Складний update з використанням декількох таблиць в oracle 11 r2, блог розробника it, розробка

Складний update з використанням декількох таблиць в oracle 11 r2, блог розробника it, розробка

Хотів би написати сьогодні про «складний» апдейт даних в Oracle за допомогою декількох таблиць. Всі розробники БД знають про те, як оновлювати дані, це одне з найперших, що все вивчають. Я не буду в цій статті лити воду, ті, хто мало знайомий з апдейтом в принципі, думаю, необхідно прочитати що це таке і з чим це їдять, а тим хто вже вважає себе досвідченим - прошу! Отже, найпростіший update виглядає так:

update table1 set column1 = 'Новосибірськ' where column1 = 'Сахалін'

Але що робити, коли потрібно оновити дані в одній таблиці, виходячи з даних в іншій таблиці? Хм..давайте зробимо це 🙂 Нещодавно, на роботі, побачив як колега запустив оновлення таблички, подивившись через спеціальний скрипт (напишу потім окремо з цього скрипту статтю), що він робить, який у нього код і найголовніше - скільки скрипт буде виконуватися ( да, oracle може показувати час закінчення зі спеціальних службових таблиць) я просто офігів - виконання скрипта має закінчитися, так через 5 днів 🙂 Виною всьому неоптимізований алгоритм виполененія апдейта. Отже, приступимо.

update (select t.adress_shop, t.adress_client, s.adress_shop as adress_shop_new, s.adress_client as adress_client_new from table1 t inner join table2 s on s.ur_number = t.ur_number) tt set tt.adress_shop = tt.adress_shop_new, tt. adress_client = tt.adress_client_new

Я думаю ви тут всі зрозуміли, що і як. Трохи поясню - вибираємо поля, які потрібно оновити з першої таблиці, також тут же вибираємо з другої таблиці, на які потрібно оновити. Все це добро чіпляємо за номером договору (не забуваємо про дублікати). Також тут спеціально використовував однакові назву полів, щоб хоч якось ускладнити, зробив 2 поля для поновлення після «set», а то просто виникав якось питання, як оновити одночасно 2 поля.

Тут я використав «inner join», але можете будь-join - кому як завгодно, залежно від посталенних завдання і продуктивності. Відповідно, в join'е можна використовувати кілька таблиць. Думаю, всі знають як Джоін до інших таблиць, це описувати я не буду, в будь-якій книзі знайти можна. Я лише хотів показати те, що вже не в кожній книзі знайдеш. Коли починав працювати з Oracle вставали у мене питання такого апдейта, мені свого часу допомогли, коли був початківець, тепер хочу допомогти вам 🙂 До речі, є ще один спосіб зробити такий же апдейт, але через «merge» - це оператор для «insert» , «delete» і «update». Напишу скрипт з невеликими поясненнями, якщо буде що незрозуміло - завжди можете задати питання:

MERGE INTO table1 t USING (SELECT * FROM table2 s) p ON (p.ur_number = t.ur_number) WHEN MATCHED THEN - коли збіглися договору, то йде сам update update set t.adress_shop = p.adress_shop, t.adress_client = p.adress_client WHEN NOT MATCHED THEN insert (t.adress_shop) values ​​( 'Нічого не знайшов')

До речі, 2 варіант вважається вже більш високого рівня. Він показує, що ви знайомі зі складним апдейтом, а також вмієте працювати з оператором «merge».

Плюс другого способу в тому, що можна вставити якесь дефолтний значення, якщо наша умова зчіпки не спрацювало. До речі, це все працює і в Oracle 10g, в 9 версії теж.

Сподіваюся, було все зрозуміло і комусь стане в нагоді це.

У мене ось таке питання. Є таблиця INFO (Сreate TABLE info (num, last_name, first_name, sndoc, sdoc, numdoc))
Суть в наступному. В поле sndoc дані все виду SSnnnnnnn, де S - будь-яке число, а N - будь-яка цифра, а поля sdoc, numdoc - порожні.
Потрібно виконати UPDATE який з sndoc в sdoc, numdoc відповідно вставить символи і цифри. SUBSTR (sndoc, 1, 2) - цим select'ом отримую символи а SUBSTR (sndoc, 3, 9) отримую цифри. Як виконати UPDATE c цими SELECT'амі?

Підкажіть, будь ласка, як можна накласти обмеження на поля в табл t, коли потрібен update не по всіх полях, а, наприклад, де t.adress_client починається на А?

Просто необхідно вказати умову «where», тобто буде щось подібно до цього «where t.adress_client like 'А%'». Якщо буде щось не ясно, пишіть, розберемося 🙂