利用带关联子查询Update语句更新数据的方法
2024-11-21 22:23:18数据库技术 主机评测网
这篇文章主要介绍了利用带关联子查询Update语句更新数据的方法,需要的朋友可以参考下
Update是T-sql中再简单不过的语句了,update table set column=expression [where condition],我们都会用到。但update的用法不仅于此,真正在开发的时候,灵活恰当地使用update可以达到事半功倍的效果。
假定有表Table1(a,b,c)和Table2(a,c),现在Table1中有些记录字段c为null,要根据字段a在Table2中查找,取出字段a相等的字段c的值来更新Table1。一种常规的思路,通过游标遍历Table1中字段c为null的所有记录,在循环体内查找Table2并进行更新,即用游标Cursor的形式。测试sql语句如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | --1.创建测试表 create TABLE Table1 ( a varchar (10), b varchar (10), c varchar (10), CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED ( a ASC ) ) ON [ PRIMARY ] create TABLE Table2 ( a varchar (10), c varchar (10), CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED ( a ASC ) ) ON [ PRIMARY ] GO --2.创建测试数据 Insert into Table1 values ( '赵' , 'asds' , null ) Insert into Table1 values ( '钱' , 'asds' , '100' ) Insert into Table1 values ( '孙' , 'asds' , '80' ) Insert into Table1 values ( '李' , 'asds' , null ) Insert into Table2 values ( '赵' , '90' ) Insert into Table2 values ( '钱' , '100' ) Insert into Table2 values ( '孙' , '80' ) Insert into Table2 values ( '李' , '95' ) GO select * from Table1 --3.通过游标方式更新 declare @ name varchar (10) declare @score varchar (10) declare mycursor cursor for select a from Table1 where c is null open mycursor fetch next from mycursor into @ name while(@@fetch_status = 0) BEGIN select @score=c from Table2 where a=@ name update Table1 set c = @score where a = @ name fetch next from mycursor into @ name END close mycursor deallocate mycursor GO --4.显示更新后的结果 select * from Table1 GO --5.删除测试表 drop TABLE Table1 drop TABLE Table2 |
虽然用游标可以实现,但代码看起来很复杂,其实用Update根据子关联来更新只要一条语句就可以搞定了,测试代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | --1.创建测试表 create TABLE Table1 ( a varchar (10), b varchar (10), c varchar (10), CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED ( a ASC ) ) ON [ PRIMARY ] create TABLE Table2 ( a varchar (10), c varchar (10), CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED ( a ASC ) ) ON [ PRIMARY ] GO --2.创建测试数据 Insert into Table1 values ( '赵' , 'asds' , null ) Insert into Table1 values ( '钱' , 'asds' , '100' ) Insert into Table1 values ( '孙' , 'asds' , '80' ) Insert into Table1 values ( '李' , 'asds' , null ) Insert into Table2 values ( '赵' , '90' ) Insert into Table2 values ( '钱' , '100' ) Insert into Table2 values ( '孙' , '80' ) Insert into Table2 values ( '李' , '95' ) GO select * from Table1 --3.通过Update方式更新 Update Table1 set c = ( select c from Table2 where a = Table1.a) where c is null GO --4.显示更新后的结果 select * from Table1 GO --5.删除测试表 drop TABLE Table1 drop TABLE Table2 |
参考资料:也许是被忽略的update语句,update 子查询
赞一个! ()