利用带关联子查询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子查询