【问题标题】:Inserting from a SELECT but changing one column?从 SELECT 插入但更改一列?
【发布时间】:2013-04-12 13:32:40
【问题描述】:

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

如果列数有限,这当然很容易,但是当列数增加时,列出所有列会有点烦人。

我正在考虑以下几点:

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

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

有什么想法吗?

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

【问题讨论】:

  • 你在用什么RDBMSRDBMS 代表关系数据库管理系统RDBMS is the basis for SQL,适用于所有现代数据库系统,如 MS SQL Server、IBM DB2、Oracle、MySQL 等...
  • 我不知道您使用的是哪个 rdbms,但我怀疑是否有任何允许这样的操作。此外,即使您有大量列,最好还是使用列列表而不是 *,尤其是在其他人可能会更改表结构的环境中。
  • 选择 * 不好的另一个原因。为您的列命名。
  • @JW 它是 DB2,但我实际上只是想看看它是否可能,而不是我会使用它......

标签: sql


【解决方案1】:

你可以使用临时表

创建临时表

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;

【讨论】:

【解决方案2】:

对于 SQL Server,语法为:

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

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

【讨论】:

  • 感谢您的回答,只是想知道是否有一个解决方案,您不必列出属性。
【解决方案3】:

使用甲骨文

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;
/

【讨论】:

    【解决方案4】:

    使用所需的列数创建一个 VIEW。

    假设 Tbl1 有 4 列。创建一个包含所需列的视图。这里 Col1 已被排除。

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

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

    INSERT INTO TBL2
    SELECT GETDATE(), * 
    FROM V1
    

    这样你就不需要每次都指定所有的列。

    希望对你有帮助

    【讨论】:

      【解决方案5】:

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

       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

      【讨论】:

        【解决方案6】:

        zim RDBMS 将允许它。 所有由 fieldname 匹配的字段都将从源中获取值,除非被 let 语句覆盖。例如。

            `add all details from details where account_month = 20190101 let level = 2 increase = base * 1.1 total = increase * amount`
        

        这将为指定会计月份的所有详细记录添加一个级别 2 记录,其中所有字段值都与源集匹配,但这些分配/计算的金额除外: 等级为2。 增加是原始基数乘以 1.1。 总计是新增加(原始基数乘以 1.1)乘以金额。 如果您切换增加和总计的分配顺序,那么总计将在计算中使用源/原始增加。

        【讨论】:

          猜你喜欢
          • 2019-08-31
          • 1970-01-01
          • 2018-01-21
          • 1970-01-01
          • 2022-11-20
          • 1970-01-01
          • 2012-07-23
          • 2021-10-16
          • 2020-08-29
          相关资源
          最近更新 更多