我有2个表Tab1和Tab2。除了Tab2比Tab1多一列外,它们都具有相同的列。现在我想将Tab2中的数据插入Tab1。
我如何实现这一目标。
我不想在插入过程中提及列名。
可以做到这一点。
谢谢
答案 0 :(得分:5)
您列出所有列:
insert into table1(col1, . . ., col100)
select col1, . . . , col100
from table2;
答案 1 :(得分:2)
alter table tab1 add additional_column_from_tab2
现在您可以使用错误的做法,并且
insert into tab1 select * From tab2
答案 2 :(得分:2)
好的,让我们在这里继续学习。
让我们使用动态SQL:
DECLARE
strStmt VARCHAR2(32767);
BEGIN
strStmt := 'INSERT INTO TAB1 SELECT ';
FOR aRow IN (SELECT * FROM USER_TAB_COLS WHERE TABLE_NAME = 'TAB1') LOOP
strStmt := strStmt || aRow.COLUMN_NAME || ',';
END LOOP; -- aRow
strStmt := SUBSTR(strStmt, 1, LENGTH(strStmt)-1) || ' FROM TAB2';
EXECUTE IMMEDIATE strStmt;
END;
满足您的所有要求。将数据从TAB2插入TAB1,而无需在代码中的任何一个表中提及单个列的名称。
好运。
答案 3 :(得分:0)
是的,可以使用user_tab_columns
字典视图来完成,如下所示:
SQL> set serveroutput on;
SQL>
SQL> create table table1(col1 int, col2 int, col3 int, col4 int);
Table created
SQL> create table table2(col1 int, col2 int, col3 int, col4 int, col5 int);
Table created
SQL> insert into table2 values(1,2,3,4,5);
1 row inserted
SQL> declare
2 v_sql varchar2(4000) := 'insert into TABLE1 ';
3 v_tab varchar2(40) := 'TABLE2';
4 begin
5 for c in ( select column_name, column_id
6 from
7 (
8 select t.column_name,
9 t.column_id,
10 max(t.column_id)
11 over ( order by t.table_name ) max_col_id
12 from user_tab_columns t
13 where t.table_name = v_tab
14 )
15 where column_id < max_col_id )
16 loop
17 if c.column_id = 1 then
18 v_sql := v_sql||'select '||c.column_name;
19 else
20 v_sql := v_sql||','||c.column_name;
21 end if;
22 end loop;
23 v_sql := v_sql||' from '||v_tab;
24 dbms_output.put_line(v_sql);
25 execute immediate v_sql;
26 commit;
27 end;
28 /
insert into TABLE1 select COL1,COL2,COL3,COL4 from TABLE2
PL/SQL procedure successfully completed
SQL> select * from table1;
COL1 COL2 COL3 COL4
---- ---- ---- ----
1 2 3 4