【问题标题】:How to insert n-1 column values in oracle database table如何在oracle数据库表中插入n-1列值
【发布时间】:2018-07-14 17:12:48
【问题描述】:

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

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

我怎样才能做到这一点。

我不想在插入时提及列名。

这个可以吗。

谢谢

【问题讨论】:

  • 请不要偷懒,指定所有列(如戈登的回答)。这是正确的做法。这将使您以及继承您的代码的人受益。
  • @KaushikNayak 我认为软件开发(就像技术的其他方面一样)主要受懒惰思想的启发。一个懒惰的人可能比其他人更有生产力和创造力。
  • @BarbarosÖzhan:是的,我完全同意你的说法。但我不相信这可以成为 OP 案的有效理由,我不喜欢更多的论点 :-)
  • @KaushikNayak OK :)

标签: sql oracle insert-into


【解决方案1】:

您列出所有列:

insert into table1(col1, . . ., col100)
    select col1, . . . , col100
    from table2;

【讨论】:

  • 感谢您的更新。我不想在插入和选择中指定列名
  • @satya,正如 Gordon 所建议的,是无错误的解决方案,被称为“最佳实践”。如果您不想指定列 - 构建动态 sql(来自 user_%、dba_% 表的通用插入语句)
  • 我认为这不是这个问题的正确答案。 OP 希望获得更动态的方式。
【解决方案2】:
alter table tab1 add additional_column_from_tab2  

现在你可以使用不好的做法和

insert into tab1 select * From tab2

【讨论】:

  • 您忘记添加“...并且在 INSERT 之后您可以ALTER TABLE TAB1 DROP COLUMN ADDITIONAL_COLUMN_FROM_TAB2”。但是 +1 以创造性的方式做错事。 :-)
【解决方案3】:

好的,让我们在这里全力以赴。

让我们使用动态 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 中,而不在代码中的任一表中提及单个列的名称。

祝你好运。

【讨论】:

  • 需要试一试
【解决方案4】:

是的,可以使用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

【讨论】:

  • 此脚本正在以例外方式执行。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 2015-06-26
  • 2021-12-20
相关资源
最近更新 更多