怎么在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))

参考技术A 直接用一个UPDATE语句就可以实现更新。
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有什么数据,然后结果希望是什么数据,这样就好了。

参考技术B update test set me = 0 where me is null本回答被提问者采纳

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里逐行修改数据的主要内容,如果未能解决你的问题,请参考以下文章

mysql中怎样才能查看历史而且逐行比较?请高手赐教!

在java中怎么修改sql里的数据啊??已经连接好数据库了

sqlserver 怎么 修改数据

SQL数据库中一个表突然不能修改和插入,怎么解决?

SQL Server数据库里面怎么修改数据库的名字?

sql修改某一行数据