一、MSSQLServer 多表关联更新
sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来。虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就可以在update的表达式 中引用要更新的表以外的其它数据。
一般形式:
update A SET 字段1=B表字段表达式, 字段2=B表字段表达式 from B WHERE逻辑表达式
例如:
UPDATE dbo.Table2
SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB
FROM dbo.Table2
INNER JOIN dbo.Table1
ON (dbo.Table2.ColA = dbo.Table1.ColA)
实际更新的 *** 作是在要更新的表上进行的,而不是在from子句所形成的新的结果集上进行的
--你要先在测试库测试哦--建表
create table t_bd_item_info
(
item_no Varchar(20),
item_subno Varchar(20)
)
--测试数据
insert into t_bd_item_info values('12345678','98765432')
insert into t_bd_item_info values('123456789012','12345678')
insert into t_bd_item_info values('1234567801234','98976543')
--得到需要替换的item_no和item_subno
Select * into #Tmp From
(
Select *,ROW_NUMBER() over(partition by item_subno order by item_no) As id
From t_bd_item_info A
Where len(item_no) in(12,13) and LEN(item_subno)=8
And not exists(Select * From t_bd_item_info B where B.item_no=A.item_subno)
) S where ID=1
--替换(包含item_no的所有表都替换)
Exec sp_MSforeachtable @command1="Update ? Set item_no=B.item_subno From ? A inner join #Tmp B on A.item_no=B.item_no",@whereand=" And o.name in (select distinct object_name(object_id) from sys.columns where name='item_no')"
--删除临时表
Drop Table #Tmp
两表关联更新用如下方法。
有以下两张表:
根据test2表中的id和test1表中的id关联,修改test1表中name字段,语句如下:
update test1 a set a.name=(select b.name from test2 b where a.id=b.id) where a.id in (select id from test2)
更新后,test1表中结果:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)