在不命名列的情况下插入数据

时间:2015-04-03 04:45:32

标签: sql oracle

我在插入数据方面遇到了问题。

假设我们有两张桌子。

第一个表格如下:

Table:customer
Column:a b c d e f

第二个是

Table:customer2
Column:a b c d e f g

如您所见,它们是相同的,只是在第二个表上添加了一列。

现在我正在尝试执行这个sql语句。

Insert into customer 
Select * from customer2

你会在不假思索的情况下知道结果。

是否有任何方法可以完成这项工作。 我的意思是需要将customer2表上的数据插入到表customer中,将g列放在一边。

不允许列出列名,因为这是按顺序完成的。 oracle服务器上存在数十个具有各种列名的varios表。

只允许使用纯SQL ...

3 个答案:

答案 0 :(得分:3)

  

只允许使用纯SQL

SELECT 语句中包含所需的列列表也是纯SQL 。使用优秀的文本编辑器在SELECT语句中列出所需的列名称应该不是一项艰巨的任务。对于开发人员来说,这不应该是一个借口。

Insert into customer 
Select a, b, c, d, e, f from customer2;

更新构建 INSET SELECT .. 脚本的示例。

使用 USER_TAB_COLS 视图和 LISTAGG 功能(或11g之前的等效功能),我可以构建插入脚本:

SQL> CREATE TABLE emp1 AS SELECT * FROM emp WHERE 1 = 2;

Table created.

SQL>
SQL> set linesize 150
SQL>
SQL> SELECT 'INSERT INTO emp1('
  2    ||listagg(column_name, ',') WITHIN GROUP (
  3  ORDER BY column_name)
  4    ||') SELECT '
  5    ||listagg(column_name, ',') within GROUP (
  6  ORDER BY column_name)
  7    ||' FROM emp' insert_script
  8  FROM user_tab_cols
  9  WHERE table_name='EMP';

INSERT_SCRIPT
---------------------------------------------------------------------------------------------------------------------------
INSERT INTO emp1(COMM,DEPTNO,EMPNO,ENAME,HIREDATE,JOB,MGR,SAL) SELECT COMM,DEPTNO,EMPNO,ENAME,HIREDATE,JOB,MGR,SAL FROM emp

SQL>

所以,我的插入脚本已经准备好了。现在让我们'测试一下:

SQL> SELECT COUNT(*) FROM emp1;

  COUNT(*)
----------
         0

SQL>
SQL> INSERT INTO emp1(COMM,DEPTNO,EMPNO,ENAME,HIREDATE,JOB,MGR,SAL)
  2    SELECT COMM,DEPTNO,EMPNO,ENAME,HIREDATE,JOB,MGR,SAL FROM emp;

14 rows created.

SQL>
SQL> SELECT COUNT(*) FROM emp1;

  COUNT(*)
----------
        14

SQL>

完美无缺!

答案 1 :(得分:1)

确定..

  1. 如果您可以在查询中对表名进行硬编码,我相信您也可以使用列名来构造查询。
  2. 但是如果你想在许多这样的表中进行这个操作,那么PL / SQL会有很大的帮助,如果PLSQL超出了你的范围,你可以使用USER_TAB_COLS,你可以在这两个表中获得列,然后在insert语句中使用以下内容。所有这些都是在sql insert查询中动态完成的。

答案 2 :(得分:0)

只需执行以下操作

Insert into customer 
Select a, b, c, d, e, f from customer2;