更新 SQL 中的多个列

Posted

技术标签:

【中文标题】更新 SQL 中的多个列【英文标题】:Update multiple columns in 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 的编辑器并将数据直接输入到行中,而不是编写查询。 Unpivot the table, and then use dynamic SQL. 【参考方案1】:

试试这个:

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

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

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

【讨论】:

这在 Oracle 中不起作用:docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj26498.html 嗨。你是对的,但我只想声明它不适用于任何 SQL 方言。 适用于 mysql【参考方案2】:

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

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

【讨论】:

那么在 MSSQL 中就没有其他方法了吗? @Joe:没有。请参阅下面 Alex K 的回答(***.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 只是松散地使用了别名,因为问题不在于语法的正确性,而在于“为什么”这种语法。就个人而言,我更喜欢像在这里一样使用别名:***.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

【讨论】:

请在您的答案中添加一些评论以解释它在做什么。目前,这被标记为低质量答案,除非改进,否则将被删除。

以上是关于更新 SQL 中的多个列的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 删除触发器以更新同一表中的多个列

使用 R 更新 SQL Server 中表的多个列

Spark 从另一个表更新 Delta 中的多个列

Oracle SQL 查询从一行中的多个列中获取最新数据

在sql server中用一个条件更新多个列

如何在 DB2 的单个更新语句中更新多个列