更新SQL中的多列


166

有没有一种方法可以像使用插入语句一样更新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多个专栏,那么编写起来可能会很累。


听起来很容易出错
AD7six

如果您以编程方式进行操作,请使用参数化查询,而只需编写一次即可。如果您手动进行操作,请使用SQL Management Studio的编辑器,然后将数据直接输入到行中,而不用编写查询。
丹·贝查德

Answers:


89

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

如果列数超过100,则您很可能会遇到设计问题……而且,客户端工具(例如,生成UPDATE语句)或使用ORM中存在缓解方法


5
因此,在MSSQL中没有其他方法可以做到吗?
2012年

4
@乔:不。请参阅下面的Alex K的答案(stackoverflow.com/a/9079904/27535),MS要求添加它
gbn 2012年

我认为使用1keydata.com/sql/sqlupdate.html “SET COLUMN_1 = [VALUE1],COLUMN_2 = [值]”
DELE

同意。一般而言,设计问题,但在某些情况下可能需要批量验证/数据清理。我目前正在这样做,并且在SQL Server 2012中,您现在可以根据下面的每个@John Woo答案更新多于1列的内容。
希拉里



19

您的查询几乎是正确的。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
gbn 2012年

17

句法

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

我尝试过这种方式,并且可以正常工作:

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

对于我的PostgreSQL 12.2安装(使用DBeaver测试),这似乎工作正常。
Telmo Trooper

1

这是一个可行的方法:

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

值是table_2中的列


1

如果您需要重新输入几次,则可以像我一次一样。将您的列名称放入excel工作表的行中(在记事本中很容易在每个列名称(=)的末尾写下),在列中复制和粘贴将与新条目相对应的值每列。然后在其右侧的一个独立列中将逗号按设计

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

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


0

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

首先,获取表2的结果。

在此处输入图片说明

接下来,取消枢纽。

在此处输入图片说明

然后使用动态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 结果:

在此处输入图片说明


-3

我在MySql中进行了此操作,并且它在一条记录中更新了多列,因此如果您使用MySql作为服务器,请尝试以下操作:

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

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



-8
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

2
请在您的答案中添加一些评论,以解释其作用。目前,这被标记为低质量答案,除非得到改善,否则将被删除。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.