更新“逐字段”:将数据从一个表复制到另一个表

时间:2018-11-10 17:50:56

标签: sql oracle

我有两个表,除了名称外,它们基本上是相同的:一个用于实际数据,第二个用于备份。我想要做的是使用另一个中的内容来更新第一个中的字段-根据ID逐字段检查。

让我们说它应该像这样:

  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 :(得分:2)

您可以尝试使用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

答案 1 :(得分:0)

我认为您只想使用相关子查询进行更新:

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);