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.创建测试表
- 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根据子关联来更新只要一条语句就可以搞定了,测试代码如下:
使用带关联子查询的Update更新
- --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