在另一个字段中插入一个不同的字段

时间:2015-03-09 01:24:17

标签: sql oracle insert

我试图在oracle中将一个表复制到另一个表,改变其中一个字段的值。

让我们说Tables Original和Temp,所以我通常会使用这个SQL:

Insert into Original Select * from Temp where site = 1

问题是现在我的原始表已经有了站点1,所以我需要将站点1的内容复制到站点2的原始表更改站点1.我通常会这样做

Insert into Original (site, field1, field2, field3) Select '2', field1, field2, field3 from Temp where site = 1

但是我有很少的表格,我正在寻找一个解决方案,我不需要在每个声明中输入字段的名称。

任何想法?

4 个答案:

答案 0 :(得分:2)

我编写了简单的PLSQL程序,代码如下。它生成插入字符串以输出, 如果这些适合您,您可以复制/粘贴它们并手动运行,或者您可以取消注释 接近行和插入将自动完成。测试样本数据,工作正常。

程序对user_tab_columns中的列进行操作。首先,您必须在声明部分中定义您感兴趣的表的列表。 您可能希望根据需要更改一些代码。

生成的输出:

insert into original (site, F1, F2, F3) select 1, F1, F2, F3 
  from TEMP1 where site = 1
insert into original (site, F2, F1, F3) select 2, F2, F1, F3 
  from TEMP2 where site = 1
insert into original (site, F3, F2, F1) select 3, F3, F2, F1 
  from TEMP3 where site = 1

程序代码:

create or replace procedure justdoit is
  type t_var is table of varchar2(30);
  -- table names in uppercase
  tabs t_var := t_var('TEMP1', 'TEMP2', 'TEMP3'); 
  v_sql1 varchar2(4000);
  v_sql2 varchar2(4000);
begin

for i in 1..tabs.count
loop
  v_sql1 := 'insert into original (site, ';
  v_sql2 :=  'select '||i||', ';
  for o in (
    select * from user_tab_columns 
      where table_name = tabs(i)
      order by column_id)
  loop
    if o.column_name <> 'SITE' then
      v_sql1 := v_sql1 || o.column_name||', ';
      v_sql2 := v_sql2 || o.column_name||', ';
    end if;
  end loop;
  v_sql1 := rtrim(v_sql1, ', ')||') '||rtrim(v_sql2, ', ');
  v_sql1 := v_sql1||' from '||tabs(i)||' where site = 1';
  dbms_output.put_line(v_sql1);
  -- execute immediate v_sql1;  -- <- uncomment this line
end loop;

end justdoit;

答案 1 :(得分:1)

您可以尝试以下查询

INSERT INTO Original select '2' from Temp union all select * from Temp where site=1;

说明:

I)价值&#39; 2&#39;将被插入名为&#34; site&#34;

的第一列

II)来自Temp表的列值field1,field2,field3将被插入原始表的field1,field2,field3

答案 2 :(得分:0)

您可以使用所需的站点列新值编写create table as select (ctas)查询,但请指定临时列名称。然后在创建表格后,删除“坏”字样。 site列,并将临时的一个重命名为site(每个表涉及3个语句),如下所示:

create table original as
select '2' as new_site, t.* from temp t where site = 1;

alter table original drop column site;

alter table original rename column new_site to site;

请注意,如果您目前只截断了这些“原始”字样。表,在从临时表运行CTAS查询之前删除它们。

答案 3 :(得分:0)

使用另一个临时表

插入temp2  从temp1中选择*  站点= 1;  更新temp2 set site = 2   其中site = 1;

插入维护  select * from temp2 where site = 2;

从temp2中删除site = 2;