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 |