从SELECT插入但更改一列?

问题描述 投票:18回答:5

想知道是否有一种方法可以将一行插入另一个表中,但一列除外?

对于有限数量的列,这当然很容易,但是当列数增加时,列出所有列时会很烦人。

我正在考虑以下方面:

Insert into table
select * replace col1 with current date
from table
where yada yada yada

一种可能性是复制一行并执行和更新,但是,假设由于索引或其他原因,这不是一个选项。

有任何想法吗?

编辑:这是DB2 v10,但问题出于纯粹的好奇心。只是想知道是否可能......

sql
5个回答
2
投票

使用Oracle

DECLARE
CURSOR CUR_D IS
  SELECT *
  FROM TABLE
  WHERE id = some id;
ROW_D CUR_D%ROWTYPE;

BEGIN
  OPEN CUR_D;
  FETCH CUR_D INTO ROW_D;
  CLOSE CUR_D;

  ROW_D.column := 'some data';

  INSERT INTO some table
  VALUES ROW_D;

END;
/

10
投票

您可以使用临时表

创建临时表

CREATE TEMPORARY TABLE temp_table AS (SELECT * FROM MyTable WHERE ...);

更新列

UPDATE temp_table SET column='Value' WHERE ...;

或者删除一列

ALTER TABLE temp_table DROP column_name;

插入目标表

INSERT INTO MyDestinationTable SELECT * FROM temp_table;

9
投票

对于SQL Server,语法为:

insert  into TargetTable
        (col1, col2, col3, ...)
select  getdate(), col2, col3, ... 
from    SourceTable

SQL Server可以为您生成列列表。右键单击表名,然后选择Script as -> Select -> To New Window


2
投票

创建一个包含所需列数的VIEW。

假设Tbl1有4列。创建包含所需列的视图。 Col1已被排除在外。

CREATE VIEW V1 AS
SELECT col2, col3, col4
FROM TBL1

使用VIEW进行插入。 TBL2的Col1值将是当前日期,对于其他列,值将来自TBL1的视图V1,即col2,col3,col4

INSERT INTO TBL2
SELECT GETDATE(), * 
FROM V1

这样,您不需要每次都指定所有列。

希望能帮助到你


1
投票

假设您的select具有在插入之前将结果集wrt唯一定义到目标表的内容的属性,您可以应用以下两个步骤:

 Insert into target_table
 select *
  from source_table
 where yada yada yada
   and characteristic_yada
     ;

update target_table
   set col1 = current date
 where characteristic_yada
     ;

 commit;

确保在所示的同一事务中发出两个命令。另外请注意characteristic_yada必须适用于源表和目标表,并且在每次应用语句之前需要检查characteristic_yada的适用性,除非它们引用了taregt表的pks / aks

© www.soinside.com 2019 - 2024. All rights reserved.