利用带关联子查询Update语句更新数据的方法
Update是T-sql中再简单不过的语句了,updatetablesetcolumn=expression[wherecondition],我们都会用到。但update的用法不仅于此,真正在开发的时候,灵活恰当地使用update可以达到事半功倍的效果。
假定有表Table1(a,b,c)和Table2(a,c),现在Table1中有些记录字段c为null,要根据字段a在Table2中查找,取出字段a相等的字段c的值来更新Table1。一种常规的思路,通过游标遍历Table1中字段c为null的所有记录,在循环体内查找Table2并进行更新,即用游标Cursor的形式。测试sql语句如下:
--1.创建测试表
createTABLETable1
(
avarchar(10),
bvarchar(10),
cvarchar(10),
CONSTRAINT[PK_Table1]PRIMARYKEYCLUSTERED
(
aASC
)
)ON[PRIMARY]
createTABLETable2
(
avarchar(10),
cvarchar(10),
CONSTRAINT[PK_Table2]PRIMARYKEYCLUSTERED
(
aASC
)
)ON[PRIMARY]
GO
--2.创建测试数据
InsertintoTable1values('赵','asds',null)
InsertintoTable1values('钱','asds','100')
InsertintoTable1values('孙','asds','80')
InsertintoTable1values('李','asds',null)
InsertintoTable2values('赵','90')
InsertintoTable2values('钱','100')
InsertintoTable2values('孙','80')
InsertintoTable2values('李','95')
GO
select*fromTable1
--3.通过游标方式更新
declare@namevarchar(10)
declare@scorevarchar(10)
declaremycursorcursorforselectafromTable1wherecisnull
openmycursor
fetchnextfrommycursorinto@name
while(@@fetch_status=0)
BEGIN
select@score=cfromTable2wherea=@name
updateTable1setc=@scorewherea=@name
fetchnextfrommycursorinto@name
END
closemycursor
deallocatemycursor
GO
--4.显示更新后的结果
select*fromTable1
GO
--5.删除测试表
dropTABLETable1
dropTABLETable2
虽然用游标可以实现,但代码看起来很复杂,其实用Update根据子关联来更新只要一条语句就可以搞定了,测试代码如下:
--1.创建测试表
createTABLETable1
(
avarchar(10),
bvarchar(10),
cvarchar(10),
CONSTRAINT[PK_Table1]PRIMARYKEYCLUSTERED
(
aASC
)
)ON[PRIMARY]
createTABLETable2
(
avarchar(10),
cvarchar(10),
CONSTRAINT[PK_Table2]PRIMARYKEYCLUSTERED
(
aASC
)
)ON[PRIMARY]
GO
--2.创建测试数据
InsertintoTable1values('赵','asds',null)
InsertintoTable1values('钱','asds','100')
InsertintoTable1values('孙','asds','80')
InsertintoTable1values('李','asds',null)
InsertintoTable2values('赵','90')
InsertintoTable2values('钱','100')
InsertintoTable2values('孙','80')
InsertintoTable2values('李','95')
GO
select*fromTable1
--3.通过Update方式更新
UpdateTable1setc=(selectcfromTable2wherea=Table1.a)wherecisnull
GO
--4.显示更新后的结果
select*fromTable1
GO
--5.删除测试表
dropTABLETable1
dropTABLETable2
参考资料:也许是被忽略的update语句,update子查询