【问题标题】:Update multiple columns in SQL更新 SQL 中的多个列
【发布时间】:2012-02-23 04:14:15
【问题描述】:

有没有办法像使用插入语句一样更新 SQL Server 中的多个列?

类似:

Update table1 set (a,b,c,d,e,f,g,h,i,j,k)=
(t2.a,t2.b,t2.c,t2.d,t2.e,t2.f,t2.g,t2.h,t2.i,t2.j,t2.k)
from table2 t2
where table1.id=table2.id

或者类似的东西,而不是这样:

update table set a=t2.a,b=t2.b etc 

如果你有 100 多列,写起来可能会很累。

【问题讨论】:

  • 听起来很容易出错
  • 如果您以编程方式执行此操作,请使用参数化查询,您只需编写一次。如果您手动执行此操作,请使用 SQL Management Studio 的编辑器并将数据直接输入到行中,而不是编写查询。

标签: sql sql-server sql-update


【解决方案1】:

试试这个:

UPDATE table1 
SET a = t2.a, b = t2.b, .......
FROM table2 t2
WHERE table1.id = t2.id

这应该适用于大多数 SQL 方言,不包括 Oracle。

是的 - 需要大量输入 - SQL 就是这样做的。

【讨论】:

【解决方案2】:

“烦人的方式”是标准 SQL 以及主流 RDBMS 是如何做到的。

如果有 100 多列,您很可能会遇到设计问题...此外,客户端工具中也有缓解方法(例如生成 UPDATE 语句)或使用 ORM

【讨论】:

  • 那么在 MSSQL 中就没有其他方法了吗?
  • @Joe:没有。请参阅下面 Alex K 的回答(stackoverflow.com/a/9079904/27535),有一个请求给 MS 添加它
  • 我认为使用1keydata.com/sql/sqlupdate.html "SET column_1 = [value1], column_2 = [value2]"
  • 同意重新。一般而言的设计问题,但在某些情况下可能需要进行批量验证/数据清理。我目前正在这样做,在 SQL Server 2012 中,您现在可以根据下面的@John Woo 答案更新超过 1 列。
【解决方案3】:

语法

UPDATE table-name 
SET column-name = value, column-name = value, ...
WHERE condition

示例

UPDATE school
SET course = 'mysqli', teacher = 'Tanzania', student = 'you'
WHERE id = 6

【讨论】:

    【解决方案4】:

    您的查询几乎是正确的。用于此的 T-SQL 是:

    UPDATE  Table1
    SET     Field1 = Table2.Field1,
            Field2 = Table2.Field2,
            other columns...
    FROM    Table2
    WHERE   Table1.ID = Table2.ID
    

    【讨论】:

    • 我怀疑 OP 只是松散地使用了别名,因为问题不在于语法的正确性,而在于“为什么”这种语法。就个人而言,我更喜欢像在这里一样使用别名:stackoverflow.com/a/982947/27535
    【解决方案5】:

    Update table1 set (a,b,c) = (select x,y,x) 语法是使用 行值构造函数,Oracle supports this,MSSQL 没有。 (Connect item)

    【讨论】:

      【解决方案6】:
         UPDATE t1 
          SET 
          t1.a = t2.a,
          t1.b = t2.b,
          .
          .
          .
      
      
          FROM 
          table1 t1 
          INNER JOIN table2 t2 ON  t1.id=t2.id
      

      你可以试试这个

      【讨论】:

      • 请记住:虽然在“内部连接”中 t1 和 t2 可以更改,但“更新 t2”不起作用。 (顺便说一句:这个答案是从显示旧值和新值的选择语句开始构建更新语句的最简单方法。)
      【解决方案7】:

      我试过这种方式,效果很好:

      UPDATE 
        Emp
      SET 
        ID = 123, 
        Name = 'Peter' 
      FROM 
        Table_Name
      

      【讨论】:

      • 这似乎适用于我的 PostgreSQL 12.2 安装(使用 DBeaver 测试)。
      【解决方案8】:

      这是一个有效的方法:

      UPDATE  `table_1`
      INNER JOIN 
       `table_2` SET  col1= value, col2= val,col3= val,col4= val;
      

      value 是 table_2 中的列

      【讨论】:

        【解决方案9】:

        如果您需要多次重新输入,您可以像我之前那样做。 将您的列名称放入 excel 表中的行中(在每个列名称(=)的末尾写下,这在 notepad++ 中很容易)在右侧制作一列以复制和粘贴您的值,该值将对应于新条目每一列。然后在它们右侧的独立列中按设计放置逗号

        然后您必须每次将您的值复制到中间列,然后粘贴并运行

        我不知道更简单的解决方案

        【讨论】:

          【解决方案10】:

          我想与您分享我是如何解决此类问题的。我的情况略有不同,因为 table2 的结果是动态的,列号可能小于 table1。但概念是一样的。

          首先,获取table2的结果。

          接下来,取消透视它。

          然后使用动态 SQL 编写更新查询。示例代码用于测试 2 个简单的表 - tblA 和 tblB

          --CREATE TABLE tblA(id int, col1 VARCHAR(25), col2 VARCHAR(25), col3 VARCHAR(25), col4 VARCHAR(25))
          --CREATE TABLE tblB(id int, col1 VARCHAR(25), col2 VARCHAR(25), col3 VARCHAR(25), col4 VARCHAR(25))
          --INSERT INTO tblA(id, col1, col2, col3, col4)
          --VALUES(1,'A1','A2','A3','A4')
          --INSERT INTO tblB(id, col1, col2, col3, col4)
          --VALUES(1,'B1','B2','B3','B4')
          
          DECLARE @id VARCHAR(10) = 1, @TSQL NVARCHAR(MAX)
          DECLARE @tblPivot TABLE(    
              colName VARCHAR(255),
              val VARCHAR(255)
          )
          
          INSERT INTO @tblPivot
          SELECT colName, val
          FROM tblB
          UNPIVOT
          (
              val
              FOR colName IN (col1, col2, col3, col4)
          ) unpiv
          WHERE id = @id
          
          SELECT @TSQL = COALESCE(@TSQL + '''
          ,','') + colName + ' = ''' + val
          FROM @tblPivot
          
          SET @TSQL = N'UPDATE tblA
          SET ' + @TSQL + ''' 
          WHERE id = ' + @id
          PRINT @TSQL
          --EXEC SP_EXECUTESQL @TSQL
          

          PRINT @TSQL 结果:

          【讨论】:

            【解决方案11】:
            UPDATE table_name
            SET column1=value1,column2=value2,...
            WHERE some_column=some_value;
            

            http://www.w3schools.com/sql/sql_update.asp

            【讨论】:

            • 这几乎只是对现有答案的重复。
            【解决方案12】:

            我在 MySql 中执行此操作,它更新了单个记录中的多个列,因此如果您使用 MySql 作为服务器,请尝试此操作:

            "UPDATE creditor_tb SET credit_amount='" & CDbl(cur_amount) & "'
                               , totalamount_to_pay='" & current_total & "',   
                    WHERE credit_id='" & lbcreditId.Text & "'". 
            

            但是,我在 vb.net 中使用 MySql 服务器进行编码,但只要您使用 MySql 作为服务器,您就可以将其转换为您最喜欢的编程语言。

            【讨论】:

              【解决方案13】:
              update T1
              set T1.COST2=T1.TOT_COST+2.000,
              T1.COST3=T1.TOT_COST+2.000,
              T1.COST4=T1.TOT_COST+2.000,
              T1.COST5=T1.TOT_COST+2.000,
              T1.COST6=T1.TOT_COST+2.000,
              T1.COST7=T1.TOT_COST+2.000,
              T1.COST8=T1.TOT_COST+2.000,
              T1.COST9=T1.TOT_COST+2.000,
              T1.COST10=T1.TOT_COST+2.000,
              T1.COST11=T1.TOT_COST+2.000,
              T1.COST12=T1.TOT_COST+2.000,
              T1.COST13=T1.TOT_COST+2.000
              from DBRMAST T1 
              inner join DBRMAST t2 on t2.CODE=T1.CODE
              

              【讨论】:

              • 请在您的答案中添加一些评论以解释它在做什么。目前,这被标记为低质量答案,除非改进,否则将被删除。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-03-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多