在SQL中更新多个列

是否有一种方法可以更新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多个列,写起来会很累人。

756213 次浏览

“令人厌烦的方式”是标准SQL和主流RDBMS如何做到这一点。

对于100多个列,您很可能遇到了设计问题……此外,在客户端工具中(例如生成UPDATE语句)或使用orm也有缓解方法

试试这个:

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

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

是的,这需要大量的输入,这就是SQL的方式。

你的问题几乎正确。这方面的T-SQL是:

UPDATE  Table1
SET     Field1 = Table2.Field1,
Field2 = Table2.Field2,
other columns...
FROM    Table2
WHERE   Table1.ID = Table2.ID
Update table1 set (a,b,c) = (select x,y,x)语法是使用的一个例子 行值构造函数,Oracle支持这一点, MSSQL没有。(连接条目) < / p >

这里有一个有效的方法:

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

Value是table_2中的列

   UPDATE t1
SET
t1.a = t2.a,
t1.b = t2.b,
.
.
.




FROM
table1 t1
INNER JOIN table2 t2 ON  t1.id=t2.id

你可以试试这个

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
如果你需要多次重新输入这个,你可以像我这样做一次。 将列的名称放入excel表格中的行中(在每个列名的末尾写下(=),这在notepad++中很容易),在右侧制作一个列来复制和粘贴您的值,这将对应于每列的新条目。然后在它们的右边单独的一列中加上逗号

然后你将不得不复制你的值到中间列每次,然后只是粘贴然后运行

我不知道还有什么更简单的解决办法

我尝试了这种方式,它工作得很好:

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

< em > < / em >语法 < BR >

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

< em > < / em >例子 < BR >

UPDATE school
SET course = 'mysqli', teacher = 'Tanzania', student = 'you'
WHERE id = 6
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;

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

我在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作为你的服务器。

我想和大家分享一下我是如何回答这类问题的。我的情况略有不同,因为table2的结果是动态的,列号可能比table1的少。但概念是一样的。

首先,获取table2的结果。

enter image description here

接下来,取消pivot。

enter image description here

然后使用动态SQL编写更新查询。示例代码是为测试两个简单的表——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结果:

enter image description here