我试图在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
但是我有很少的表格,我正在寻找一个解决方案,我不需要在每个声明中输入字段的名称。
任何想法?
答案 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;