【问题标题】:SQL Insert existing/duplicate row into table but change only one column value?SQL将现有/重复行插入表中但仅更改一列值?
【发布时间】:2017-10-07 19:58:54
【问题描述】:

我有超过 50 列的 Audit 表,需要通过仅更改一列值(列 CreatedDate,将值设置为 GETDATE())来插入所需的行(重复)。我知道这可以通过 INSERT INTO SELECT * FROM 来实现,但由于有 50 多列,代码看起来很乱:

INSERT INTO Audit_Table (Col1, Col2, .....CreatedDate, ......, Col50, ...ColN)
SELECT (Col1, Col2, .....GETDATE(), ......, Col50, ...ColN) FROM Audit_Table 
WHERE  Audit_Table.Id = Desired_Id

如果我不应该更改 CreatedDate 列的值,那将非常简单:

INSERT INTO Audit_Table SELECT * FROM Audit_Table WHERE Audit_Table.ID = Desired_Id

有没有其他方法可以复制行并仅更改一个/所需的列值?

【问题讨论】:

  • Ups,我忘了,是MSSQL。
  • 我不会考虑明确说明列名是混乱的。如果您使用的是 SSMS,您只需将 Column 节点从对象资源管理器拖到您的查询中。

标签: sql sql-server select insert


【解决方案1】:

您可以将记录插入临时表,将 CreatedDate 列更新为 GETDATE(),然后将其插入 Audit_Table。

【讨论】:

  • 我正在编辑我的答案,以添加另一个解决方法 - 这正是你的,Marko。恭喜!
【解决方案2】:

您可以在现有想法的基础上再接再厉。只需复制该行(我假设您有一个自动递增的主键列),然后在单独的查询中更新时间,即

这样做:

INSERT INTO Audit_Table SELECT * FROM Audit_Table WHERE Audit_Table.ID = Desired_Id

然后:

UPDATE Audit_Table SET CreatedDate = GETDATE() WHERE primaryKeyID = newPrimaryKeyID

希望对你有帮助!!!

【讨论】:

    【解决方案3】:

    没有。 SQL中没有办法说* except column_foo

    解决方法是生成

    SELECT
      col1
    , col2
    , [...]
    , coln
    FROM foo;
    

    语句(或它的一部分)通过在数据库的系统目录中查询列名的顺序。总是有一个包含所有表的表和一个包含所有列的表。 然后,确保将必要的逗号放在正确的位置(或在不需要它们的地方删除它们,或者在报告的所有行中生成逗号,但第一行 - 通过使用ROW_NUMBER() OLAP 函数并评估是否它返回 1 或其他值)。最后,编辑正确的日期列,将其替换为 CURRENT_DATE 或您的数据库在当天使用的任何内容。

    祝你好运 - 马可

    【讨论】:

      【解决方案4】:
      try below as reference
      
      you can use below statement to copy the all rows,
      mysql> insert into newstudent select * from students;
      
      
      you can use below statement to copy the specific row from table,
      mysql> insert into newstudent
          -> select id, name, age, address
          -> from students
          -> where
          -> id = 1248;
      
      
      you can use below statement to copy the either of the row from table,   
          mysql> insert into newstudent
          -> select id, name, age, address
          -> from students
          -> where
          -> id = 1248 or id=1249;
      
      use limit clause also along with this
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-10
        相关资源
        最近更新 更多