【SQL Server】使用CTE批次更新数据表

【SQL Server】使用CTE批次更新数据表
最近想到一个问题,就是如果数据表的数据要做一个批次更新时候有哪些方法可以达成呢?我想这时候应该没有人会想一个个下Update吧,况且这样也不实际...
CTE是什么?
一般数据表运算式 (CTE) 可视为在单一 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 陈述式之执行范围内定义的暂存结果集。CTE 与衍生数据表类似的地方在于,它不会保存为对象,而且其生命周期仅限于查询期间。但是与衍生数据表不同的是,CTE 可以自我参考,而且在同一查询中可参考多次。(TechNet)
简单来说有点像似抛弃式的View...但是本篇重点不再CTE...就交给有兴趣的朋友上网搜寻啰


最近想到一个问题,就是如果数据表的数据要做一个批次更新时候有哪些方法可以达成呢?我想这时候应该没有人会想一个个下Update吧,况且这样也不实际...

CTE是什么?

一般数据表运算式 (CTE) 可视为在单一 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 陈述式之执行范围内定义的暂存结果集。CTE 与衍生数据表类似的地方在于,它不会保存为对象,而且其生命周期仅限于查询期间。但是与衍生数据表不同的是,CTE 可以自我参考,而且在同一查询中可参考多次。(TechNet)

简单来说有点像似抛弃式的View...但是本篇重点不再CTE...就交给有兴趣的朋友上网搜寻啰

以下用简单的范例来说明

Productid Value
A 100
B 200
C 300
D 400

但,想将商品A更新为500,商品B更新为600,此时数据笔数少,可以下两次Update但是数量多的时候,谁会想慢慢地一直下Update命令呢?

所以小弟的想法就是,将要更新的目标值放置在其他数据表(或暂存的数据表)堆放,利用Join的方法来做大量数据更新!

将两张数据表,先Join在一起,这样一来要修改的数据与原始数据就有了连结,再利用Update简单的命令来做数据更新


USE tempdb
GO
--原始数据表
CREATE TABLE table1 
(
 Productid varchar(10),
 Value int
)
--批次更新使用的数据表
CREATE TABLE table2
(
 Productid varchar(10),
 Value int
)
--填充数据
insert into table1 (Productid,Value) values ('A',100)
insert into table1 (Productid,Value) values ('B',200)
insert into table1 (Productid,Value) values ('C',300)
insert into table1 (Productid,Value) values ('D',400)
insert into table2 (Productid,Value) values ('A',500)
insert into table2 (Productid,Value) values ('B',600)
;
--将两张数据表先做Join,存放于暂时的结果集中
--
with Batch AS
(
	SELECT table1.Productid,table1.Value,table2.Productid [Productid2],table2.Value [Value2] FROM table1
	INNER JOIN table2
	ON table1.Productid = table2.Productid
)
--下更新命令
UPDATE Batch
SET Value = Value2
--显示最后结果
SELECT * FROM table1

--DROP TABLE TABLE1
--DROP TABLE TABLE2


大家好我是馒头,希望大家喜欢我的文章

如果有错误的地方请不吝指教 ^_^