Обновление «поле за полем»: копирование данных из одной таблицы в другую - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть две таблицы, которые в основном совпадают, за исключением названия: одна для фактических данных, вторая для резервного копирования. И то, что я хочу сделать, это обновить поля в первом, используя содержимое другого - проверка поля по полю на основе идентификатора.

Допустим, это должно выглядеть так:

  1. Получить первый ряд.
  2. FIRST_TABLE (ID_FT, NAME_FT) и SECOND_TABLE (ID_ST, NAME_ST),
  3. Если ID_FT == ID_ST, то NAME_FT = NAME_ST,
  4. Получить следующий ряд,
  5. Перейти к пункту 3 и цикл до конца FIRST_TABLE.

Какие запросы мне следует использовать? Как выглядит перебор таблицы в ORACLE / SQL?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Вы можете попробовать использовать оператор MERGE .

Данные испытаний:

SQL> create table FIRST_TABLE (
2 ID_FT number(20),
3 NAME_FT varchar2(200));
4 create table SECOND_TABLE (
5 ID_ST number(20),
6 NAME_ST varchar2(200));
7 insert into FIRST_TABLE (ID_FT,NAME_FT) values (1,null);
8 insert into FIRST_TABLE (ID_FT,NAME_FT) values (2,null);
9 insert into SECOND_TABLE (ID_ST,NAME_ST) values (1,'ST1');
10 insert into SECOND_TABLE (ID_ST,NAME_ST) values (2,'ST2');
11 insert into SECOND_TABLE (ID_ST,NAME_ST) values (3,'ST3');
12 commit;

Запрос:

SQL> merge into first_table t1
2 using second_table t2
3 on (t1.id_ft = t2.id_st)
4 when matched then update set t1.name_ft = t2. name_st;
5 commit;
6 select * from first_table;

ID_FT       NAME_FT 
---------- ---------- 
  1         ST1
  2         ST2

Также, если вы будете использовать MERGE, вы можете вставить данные в first_table, если они отсутствуют.

SQL> merge into first_table t1
2 using second_table t2
3 on (t1.id_ft = t2.id_st)
4 when matched then update set t1.name_ft = t2. name_st
5 when not matched then insert (t1.id_ft,t1.name_ft) values (t2.id_st,t2.name_st);
6 commit;
7 select * from first_table;

ID_FT       NAME_FT 
---------- ---------- 
  1         ST1
  2         ST2
  3         ST3
0 голосов
/ 10 ноября 2018

Я думаю, что вы просто хотите обновление с коррелированным подзапросом:

update first_table ft
    set name_ft = (select t2.name_st from second_table st where ft.ID_FT = st.ID_ST)
    where exists (select t2.name_st from second_table st where ft.ID_FT = st.ID_ST);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...