代码之家  ›  专栏  ›  技术社区  ›  Konstantin Spirin

自动匹配插入到中的列…选择…从

  •  12
  • Konstantin Spirin  · 技术社区  · 15 年前

    SQL Server问题。 什么时候做

    INSERT INTO T1 SELECT (C1, C2) FROM T2
    

    我不想指定 T1 因为它们和 T2

    可以这样做吗?

    现在我出错了

    消息213,级别16,状态1,行1

    提供的列名称或值数与表定义不匹配。

    7 回复  |  直到 8 年前
        1
  •  3
  •   Donnie    15 年前

    如果 T1 T2 完全匹配你有两个选择。你也可以 select 来自的所有列 T2 对于 insert into T1 或者您可以向 insert 语句。

    即使当你做一个 选择 MSSQL提供的列标题信息不被 插入 语句以向上匹配列。

        2
  •  18
  •   Remus Rusanu    15 年前

    在插入和选择投影中始终使用显式列。即使你不想,你也应该:

    INSERT INTO T1 (C1, c2)
    SELECT C1, C2 FROM T2
    
        3
  •  13
  •   Guffa    15 年前

    是的,可以省略插入表的字段名,也可以使用select*从表中获取所有字段,但我不建议使用这种方法。

    如果省略字段名,则字段将按位置而不是按名称匹配。如果字段的顺序不完全相同,它们将混合在一起。通常,您应该避免依赖表的精确布局,以最小化表中的更改破坏查询的风险。

        4
  •  2
  •   Sparky    15 年前

    为什么不简单

    INSERT INTO t1
    SELECT * FROM T2
    
        5
  •  0
  •   leepowers    15 年前

    如果您担心列名,则可以始终为它们命名:

    INSERT INTO T1 (C1, c2)
    SELECT C1 AS C1_ALIAS, C2 AS C2_ALIAS FROM T2
    

    或者更简洁地说:

    INSERT INTO T1 (C1, c2)
    SELECT C1 C1_ALIAS, C2 C2_ALIAS FROM T2
    

    虽然我真的想不出为什么要用这么简单的例子

        6
  •  0
  •   ehuehu    8 年前

    首先选择此SQL,从SQL结果中选择表行并更改目标或源表名。如果表具有相同的列(不需要相同的顺序),它将起作用。

     with xparams as (      select (select user from dual) "OWNER", '' "ADDSTRTOFROMTABLENAME" from dual  )
      ,t1 as (  SELECT dbat.table_name from dba_tables dbat, xparams where dbat.owner = xparams.OWNER )
      ,t1c1 as (  SELECT utcs.table_name ,  LISTAGG(utcs.column_name,',') within group (order by utcs.column_name) "COLS"  from USER_TAB_COLUMNS utcs, t1 where utcs.table_name = t1.table_name group by utcs.table_name )
      ,res1 as ( SELECT 'insert into '|| t1c1.table_name || ' ( '|| t1c1.COLS ||') select '|| t1c1.COLS || ' from ' || t1c1.table_name||xparams.ADDSTRTOFROMTABLENAME ||';' "RES" from t1c1, xparams order by t1c1.table_name )
    select * from res1
    
        7
  •  -1
  •   Paul Collingwood    12 年前

    参考如下:

    INSERT INTO NEWTABLENAME COL1[,COL2,..COLN]
    SELECT COL1[,COL2,..COLN] FROM THE EXISTINGTABLENAME