如何在Oracle数据库表中插入n-1列值

时间:2018-07-14 17:12:48

标签: sql oracle insert-into

我有2个表Tab1和Tab2。除了Tab2比Tab1多一列外,它们都具有相同的列。现在我想将Tab2中的数据插入Tab1。

  • Tab1:col1,col2 ..... col100
  • Tab2:col1,col2 ..... col100,col101

我如何实现这一目标。

我不想在插入过程中提及列名。

可以做到这一点。

谢谢

4 个答案:

答案 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;

SQLFiddle here

满足您的所有要求。将数据从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