怎么在SQL里逐行修改数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么在SQL里逐行修改数据相关的知识,希望对你有一定的参考价值。
我要做一个这个数据
表Test中有一列ME
逐行对比
如果ME有值,那么ME的值不变
如果ME没有值NULL,则更新它为0
分数不多,谢谢大家
那先有一个TEST2中有一列WE,
我要把TESt中ME=test2.WE-test.me,实现重新给test的me赋值
是不是这样啊
update test set me=((select we from test2)-(select me from test))
UPDATE TEST SET ME = 0 WHERE ME IS NULL
当ME字段是空时,更新为0,不知道ME是什么类型,这么写是数字的0
或者,使用CASE WHEN更能体现你的意图
UPDATE TEST SET ME = (CASE WHEN ME IS NULL THEN 0 ELSE ME END)
逐行更新,当ME是空,更新成0,否则保持不变
你那么写没必要,首先,你更新ME,首先这个ME在本行就是可以使用的,也就是你减法的后一半SQL,使用ME就可以了。还有,你的TEST2只有一行数据么?如果不止一行,那么你减法的第一个被减数的SQL,返回的结果就不唯一了,那么这个语句一定是错误的。
TEST2和TEST有没有关联条件?就是直接减么?没有TEST2哪一行减掉TEST1哪一行?
UPDATE TEST SET ME = ((SELECT WE FROM TEST2 where条件) - ISNULL(ME,0))
这样是可以的,注意一下ISNULL(ME,0),这个是SQLSERVER的语法,表示如果ME字段是空,给一个默认值是0.否则空做减法会出问题,结果就不对了。追问
UPDATE TEST SET ME = ((SELECT WE FROM TEST2 where条件) - ISNULL(ME,0))
这样好像不能全部修改啊,
我要做的是test中的me的值全部更新为test2的we-test的me的值
你给的sql语句好像不能实现
子查询
SELECT WE FROM TEST2 where条件
条件写什么,我要做的是全部更新test,没有条件
嗯,不知道你明白没有
更新TEST表的行,是有UPDATE的WHERE条件决定的,所以这个语句,是对全表数据进行更新。而子查询中的WHERE条件,是TEST2和TEST的连接条件,否则你取TEST2中的WE的哪一行呢?TEST2我想应该不止有一行记录吧?
以上语法的意思就是更新表TEST,设置TEST表的ME字段等于根据某种条件从TEST2中取出的WE值减去原有的ME的值。
你还是直接把你的TEST和TEST2贴出来,或者用数据举个例子。
因为您这么说,并没有描述清楚,那个子查询,必须返回唯一的一个值,如果多个值,您说该算成哪个呢?
举个例子,比如
TEST 表 ME
1
2
NULL
100
TEST2表是什么样的呢?难道只有一行?WE就等于某个值?
比如TEST2的WE
5
10
有两行,那么你说用WE减去ME,怎么个减法呢?是用5减,还是10减?所以应该有一个关联条件来确定到底使用5还是使用10
然后TEST表的ME每一行都减去这一个值是么?如果是,那么子查询的WHERE条件去掉,不过我想应该不是这样的吧?
打个比方啊
test2的数据来源于test,只不过字段会少一些
然后那test2的数据来做一些计算以后
算一下test2与test的差别,重新赋给test
表结构
test
ME
test2
WE
这样明白吗?然后计算方式是
test中的me的值全部更新为test2的we-test的me的值
朋友你好,您到现在也没有把您的表数据和关联情况说清楚。
能麻烦您用真实的数据来举例子么?
您只要说test中me有什么数据,test2中we有什么数据,然后结果希望是什么数据,这样就好了。
SQL逐行更新的实现
1、原始记录逐行更新
数据结构:
使用游标,对原始记录逐行进行更新:
DECLARE My_Cursor CURSOR --定义游标
FOR (select * from 仪表盘) --查出需要的集合放到游标中
OPEN My_Cursor; --打开游标
FETCH NEXT FROM My_Cursor ; --读取第一行数据
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE 仪表盘 SET 指标值 = rand()*100 WHERE CURRENT OF My_Cursor; --更新
--DELETE FROM 表名 WHERE CURRENT OF My_Cursor; --删除
FETCH NEXT FROM My_Cursor; --读取下一行数据
END
CLOSE My_Cursor; --关闭游标
DEALLOCATE My_Cursor; --释放游标
GO
2、分组逐行更新
数据结构:
按照分组,对分组内的数据分别逐行更新:
DECLARE My_Cursor CURSOR --定义游标
FOR (select * from 设备分时数据 where 设备 in(select 设备 from 设备分时数据 group by 设备 having count(设备)>1)) --查出需要的集合放到游标中
OPEN My_Cursor; --打开游标
FETCH NEXT FROM My_Cursor ; --读取第一行数据
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE 设备分时数据 SET 指标 = rand() WHERE CURRENT OF My_Cursor; --更新
--DELETE FROM 表名 WHERE CURRENT OF My_Cursor; --删除
FETCH NEXT FROM My_Cursor; --读取下一行数据
END
CLOSE My_Cursor; --关闭游标
DEALLOCATE My_Cursor; --释放游标
GO
以上是关于怎么在SQL里逐行修改数据的主要内容,如果未能解决你的问题,请参考以下文章