将数据从一个表插入到一个单列另一个没有关系的表

Posted

技术标签:

【中文标题】将数据从一个表插入到一个单列另一个没有关系的表【英文标题】:insert data from one table to a single column another table with no relation 【发布时间】:2017-04-28 12:37:37 【问题描述】:

我需要将数据插入到已经有一些数据的表中,现在向表中添加了一个新列,我们需要使用另一个表中的值插入/更新新列。

create table target_tab (fname varchar2(20), acc_no number);

insert into target_tab values('Anybody',121);
insert into target_tab values('Somebody',122);
insert into target_tab values('Nobody',123);

alter table target_tab add sc_vlan varchar2(20);

create table source_tab (rsrc_nm varchar2(20));

insert into source_tab values ('2839_124');
insert into source_tab  values('2839_125');
insert into source_tab values('2839_126');
insert into source_tab values('2840_131');
insert into source_tab values('2841_132');
insert into source_tab values('2840_134');
insert into source_tab values('2840_127');

现在我们需要将 source_tab 中 rsrc_nm 列的值插入到 target_tab 的 scvlan 列中。

注意:我们在两个表之间没有任何关系,就像我们在示例中看到的那样,target_tab 的行数少于 source_tab,那么只有 target_tab 中的行应该使用 source_tab 中的唯一值插入/更新。 我们可以从 source_tab 中获取任何值。

 declare 

  cursor c_1 is select rsrc_nm 
            from source_tab                                                                                                                                                   
              where rownum <= (select count(1)                                                                                                                                                 
               from target_tab);                                                                                                                                                                

  type t_tab is table of c_1%rowtype index by pls_integer;
  l_tab t_tab;

begin

  open c_1;
  fetch c_1 bulk collect into l_tab;
    for i in 1..l_tab.count
    loop  

      update target_tab set sc_vlan = l_tab(i).rsrc_nm
      where sc_vlan is null
      and rownum = 1;
      commit;
    exit when c_1%notfound;
  end loop;
  close c_1;

EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line(SQLERRM);
    dbms_output.put_line(dbms_utility.format_error_backtrace());    
end;

【问题讨论】:

你的代码和你的表结构不匹配,真的不清楚你想做什么。 是的,不幸的是,我的代码没有达到我的要求!但是我看不到表结构和代码不匹配的原因可能是我不清楚要求。我有一个表,现在在这个新列中使用 alter 语句添加了一个新列,我需要填充从另一个表中获取的值! 【参考方案1】:

我认为你可以像这样使用merge

merge into target_tab t
using (
  select s.rsrc_nm, t.rwd
    from (select row_number() over (order by acc_no)  rn, t.*, rowid rwd 
            from target_tab t) t
    join (select row_number() over (order by rsrc_nm) rn, s.* 
            from source_tab s) s
      on t.rn =s.rn
    ) s
on (t.rowid = s.rwd)
when matched then update set t.sc_vlan = s.rsrc_nm

对两个表中任意列的数据进行排序,使用row_number 匹配它们并更新。

【讨论】:

感谢 Ponder,它正在工作让我尝试使用更大数据集的原始表。这句话真好!

以上是关于将数据从一个表插入到一个单列另一个没有关系的表的主要内容,如果未能解决你的问题,请参考以下文章

将一个表的查询结果插入到另一个表中(oracle、mysql、sql 、GP)

通过表单将数据从一个表插入到另一个表

将数据从一个表更新到另一个没有通用标识符的表

创建表,然后将数据从另一个表插入到新表中

Laravel错误将数据从另一个表插入到表中

我想将表单中的数据插入到表中,然后从另一个表中选择另一个数据并使用 PHP 插入到第三个表中