关于sqlserver某个字段的update更新操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于sqlserver某个字段的update更新操作相关的知识,希望对你有一定的参考价值。

表table1中有两个字段(user_id, telephone) user_id为主键;
表table2中其中两个字段(joid_id,telephone),join_id是跟table1中的user_id关联,table2中可能存在重复的数据;我现在要批量更新table2中的telephone字段,将table2中的telephone更新为joid_id等于table1中的user_id的telephone,求例如下:

table1
user_id telephone
1 123456
2 456789
table2
joid_id telephone
1 758495
1 758495
2 845621
更新后的结果为
table1
user_id telephone
1 123456
2 456789
table2
joid_id telephone
1 123456
1 123456
2 456789
求给出sql语句

参考技术A update a set a.telephone=b.telephone

from table2 a
inner join table1 b on a.joid_id=b.user_id

或者
update table2
set telephone=a.telephone
from table1 a
WHERE table2.joid_id=a.user_id

两种方式都可以追问

恩,我是想到了用merge来操作,也是可以的,merge into table2 t using
(select user_id,telephone from table1) b
on t.user_id = b.joid_id
when matched then
update set t.telephone = b.telephone

追答

嗯 实现方式很多,你可以用查询分析器分析下哪个效率高用哪个了

本回答被提问者和网友采纳
参考技术B update table2
set table2.telephone = table1.telephone
from table1, table2
where table2.joid_id = table1.[user_id]

user_id与关键字相同了,要用[]包起来,本地测试通过。

参考技术C update table2 t2 set telephone=(select t1.telephone from table1 t1 where t1.user_id=t2.joid_id)追问

一看就知道是错误的,后面的子查询显然是个多数据集合,怎么跟前面的telephone对应更新

追答

你说表2有重复数据,表1又没有,怎么会是多数据?

追问

你这个语法就是错误的,自己好好理解一下,或者拿到本地去执行一下,你这个更新语句变成一对多关系,看懂了没有

追答

无语了,是不是一对多,是取决你table1的数据的,你又没说table1有重复数据,如果table1有重复数据这样当然不行了
如果你的table1有重复数据,那你根本没办法更新,你一个user_id对应多个号码,你怎么更新到table2.....

追问

你为什么还没看出你语句的问题呢....你的子查询select t1.telephone from table1 t1 where t1.user_id=t2.joid_id 返回的值显然是多个,而前面的update显然是针对单个数据更新,这不是一对多吗,如果看不出来,你自己运行一下这语句就明白了

追答

select t1.telephone from table1 t1 where t1.user_id=t2.joid_id 这后面有个条件
t1.user_id=t2.joid_id
怎么会有多个?
比如说你t2表中的joid_id=1的时候,对应的t1表中user_id有多个?那我也没办法

追问

user_id是主键怎么会有多个,select t1.telephone from table1 t1 where t1.user_id=t2.joid_id
这个查询出来的结果显然是
telephone
123456
456789
这不是多个吗
你为什么不试着运行一下你的这个语句呢
你的where条件是在子查询里面,又不是在update操作里面

追答

算了,不跟你说了,原来你根本不知道这是什么意思

追问

我都想笑了...你自己验证过这个语句没有?我是在帮你解释你这个错误....我帮你执行一下,错误日志:

是你自己根本不知道这是什么意思才对,对于dml理解还不够

追答

不止一个是因为你里面有重复的,你试试
select user_id,count(telephone) from table1 group by user_id having count(telephone)>1;看看
应该有数据重复

追问

你的思路可能是对的,但是你的语法肯定是错的.表里面也没有存在重复数据.过滤条件不能放在子查询里面明白吗.update只是对单数据进行操作,即使是批量更新也只是根据不同的条件进行单数据循环操作,不可能做到智能化地把所有的条件并在一起一次性更新.你是先把所有的条件并在一起查询出来一次性更新,就类似于update table set id = (1,2,3) ,你说这个语句是对的吗..

追答

但是更新的时候会用到游标啊,实际上它是一条一条的更新的
子查询的数据也是根据你更新的那一条,逐个取的
不过你sqlserver可能原理不一样吧。。。。
既然你报错的话,那应该是原理不一样了

追问

你语句都是错误的,怎么用到游标,update table set id = (1,2,3)这样的更新操作,你怎么让他智能知道1代表哪一条,2代表哪一条.....你要说的原理不一样,是跟哪个数据库的原理不一样??...传统型数据库oracle sqlserver mysql等等,对于update的更新操作原理都是一样的;数据库是有一个共同基本的标准规范的,都要遵循这个标准规范

追答

update table2 t2 set telephone=(select t1.telephone from table1 t1 where t1.user_id=t2.joid_id)
你没看我后面有指定 t1.user_id=t2.joid_id吗
在oracle里,取的不是一个集合,就是更新的那一条数据的joid_id在t1表中所对应的数据
并不是你所说的(1,2,3)
只要t1里没有重复数据,这个在oracle里肯定不会报错,我用了这么多年了。。。。

参考技术D update table2
set telephone=a.telephone

from table1 a
WHERE table2.joid_id=a.user_id

以上是关于关于sqlserver某个字段的update更新操作的主要内容,如果未能解决你的问题,请参考以下文章

如何用sql语句将一个字段的值加1-MS-SQLServer/疑难问题

在数据库中根据某个值递增更新(update)某个字段

sqlserver关联更新问题

mongodb的update函数更新数据,更新文档中的某个具体字段的数据

update inner join set 和 update set from ,如何使用一个表中的字段更新另一个表中字段,MySQL和SqlServer不一样

MySql 更新update表中某一个字段记录