日期:2014-05-17  浏览次数:20533 次

SQL UPDATE 的问题
本帖最后由 yilin54 于 2013-01-18 15:14:12 编辑
有学生表 和智力表,把智力表中的智力值更新到学生表中。

1:update set 智商值 =(select 智商值 from 智力表 where 智力表.姓名 = 学生表.姓名) where  学生表.省份='浙江'
2:update set 智商值 =(select 智商值 from 智力表 where 智力表.姓名 = 学生表.姓名 and 学生表.省份='浙江') 

请问 这两句的执行结果应该一样的吧? 效率也是一样吗?

------解决方案--------------------
1、这个你自己备份一个表然后测试一下就知道了。
2、我喜欢这样写,你那个写法太混乱了,好像还有错:
UPDATE b  
set b.智商值 =a.智力值
FROM 智力表 a INNER JOIN 学生表  b ON a.姓名=b.姓名 AND b.省份='浙江'

------解决方案--------------------
可以用事务执行以下,看看效果就知道了,效果应该是一样的

begin tran
update 学生表 set 智商值 =(select 智商值 from 智力表 where 智力表.姓名 = 学生表.姓名) where  学生表.省份='浙江'

select * from 学生表 where 省份='浙江'
rollback

begin tran
update 学生表 set 智商值 =(select 智商值 from 智力表 where 智力表.姓名 = 学生表.姓名 and 学生表.省份='浙江') 

select * from 学生表 where 省份='浙江'
rollback
--如果确认没问题可以用commit提交

还有一点,关联最好要用学号,不要用姓名,如果有重名的学生,你的语句就要报错了
------解决方案--------------------
问题在表关联的方式,你可以三个的执行计划对比一下,看百分比最高的部分在哪里
------解决方案--------------------
Quote: 引用:

引用:
1、这个你自己备份一个表然后测试一下就知道了。
2、我喜欢这样写,你那个写法太混乱了,好像还有错:


SQL code
?



123

UPDATE b   set b.智商值 =a.智力值 FROM 智力表 a INNER JOIN 学生表  b ON a.姓名=b.姓名 AND b.省份='浙江'
试了下,,你这个……[/qu当然是时间问题了,你的第二个用的是两张表相互穿插关联,学生表(智力表)的数据太多,导致时间过长;第一个只是在学生表中进行关联,不涉及智力表,时间复杂度降低,所以时间要快的多;而#1的写法用到了存储过程,效率大大的提高