今天在写代码的时候发现一个有趣的问题,同时也暴露了之前写的代码有问题,还好之前没有出现重复的情况,及时发现了这个问题,及时改了回来,不然就GG了

下面先上代码,再给大家解说一下

CREATE TABLE #t1 (id INT,value int)
CREATE TABLE #t2 (id INT,value int) INSERT #t1(id,value)
VALUES( 1, 1 ),
( 2, 2 ),
( 3, 3 ),
( 4, 4 ) INSERT #t2(id,value)
VALUES( 1, 1 ),
( 1, 2 ),
( 1, 3 ) SELECT * FROM #t1
SELECT * FROM #t2 --;
--WITH t1 AS(
--SELECT b.id,SUM(a.value) value FROM #t2 a INNER JOIN #t1 b ON b.id = a.id GROUP BY b.id) --UPDATE #t1 SET #t1.value= a.value+b.value FROM #t1 a INNER JOIN t1 b ON b.id = a.id UPDATE #t1 SET #t1.value= a.value+t.value FROM #t1 a INNER JOIN #t2 t ON t.id = a.id SELECT * FROM #t1 DROP TABLE #t1
DROP TABLE #t2

其实当你看代码就知道,我想根据b表修改a表,按我们的思维,a表id=1的有一条记录,b表id=1的有三条,

这样级联修改以后应该c结果中id=1的值应该是7才对,但是只有2,说明是a表里面的1加了b表里面的value=1 的第一条记录,我在SQL交流群里面问了一下

有人说a表只有一条记录,b表有三条记录,只匹配了第一条,然后我就试了一下,在a表中造了三条记录

CREATE TABLE #t1 (id INT,value int)
CREATE TABLE #t2 (id INT,value int) INSERT #t1(id,value)
VALUES( 1, 1 ),
( 1, 2 ),
( 1, 3 ),
( 4, 4 ) INSERT #t2(id,value)
VALUES( 1, 1 ),
( 1, 2 ),
( 1, 3 ) SELECT * FROM #t1
SELECT * FROM #t2 --;
--WITH t1 AS(
--SELECT b.id,SUM(a.value) value FROM #t2 a INNER JOIN #t1 b ON b.id = a.id GROUP BY b.id) --UPDATE #t1 SET #t1.value= a.value+b.value FROM #t1 a INNER JOIN t1 b ON b.id = a.id UPDATE #t1 SET #t1.value= a.value+t.value FROM #t1 a INNER JOIN #t2 t ON t.id = a.id SELECT * FROM #t1 DROP TABLE #t1
DROP TABLE #t2

然后出现一件很神奇的事

可以看见,即使a表有三条,匹配的b表依旧只有是第一条

所以及时看见这个坑,阿西吧,又是踩坑的一天,还好检查代码发现了问题

经过修正后的代码,有三种解决方案,第一子查询汇总修改,第二用 CTE(CTE表示公用表表达式,是一个临时命名结果集,始终返回结果集)语法解决,第三种使用循环,

具体使用看实际情况,因为我的级联修改是在循环外,所以就用前两种,我一般使用CTE 语法修改,这个语法用法还是很普遍很爽的,但是使用有限制,脱离主体只能使用一次,

如果你要用多次,建议使用临时表或者表变量(个人推荐表变量,具体使用还是要看情况,差异还是挺大的,有时间我为大家写一篇这三种的异同的随便)

不哔哔,直接上代码

CREATE TABLE #t1 (id INT,value int)
CREATE TABLE #t2 (id INT,value int) INSERT #t1(id,value)
VALUES( 1, 1 ),
( 2, 2 ),
( 3, 3 ),
( 4, 4 ) INSERT #t2(id,value)
VALUES( 1, 1 ),
( 1, 2 ),
( 1, 3 ) SELECT * FROM #t1
SELECT * FROM #t2 --;
--WITH t1 AS(
--SELECT b.id,SUM(a.value) value FROM #t2 a INNER JOIN #t1 b ON b.id = a.id GROUP BY b.id) --UPDATE #t1 SET #t1.value= a.value+b.value FROM #t1 a INNER JOIN t1 b ON b.id = a.id UPDATE #t1 SET #t1.value= a.value+t.value FROM #t1 a INNER JOIN (SELECT id,SUM(value) value FROM #t2 WHERE #t2.id=id GROUP BY id)t ON t.id = a.id SELECT * FROM #t1 DROP TABLE #t1
DROP TABLE #t2

这就舒服了,终于实现了我要的效果,这是使用子查询的

这就比较爽了,至于循环就自己下去试一下,可以用游标,也可以用while循环

游标直接修改就行了,用while循环,要先给参考表一个行号,可以用  ROW_NUMBER() 实现

具体看自己,今天分享结束了,想想就后怕,这么大个坑,出问题就GG了,今天分享出来,也希望给大家一个参考

SQL Server 根据一个表数据修改另外一个表数据的更多相关文章

  1. Sql Server 中将由逗号“,”分割的一个字符串转换为一个表集,并应用到 in 条件中

    Sql Server 中将由逗号“,”分割的一个字符串,转换为一个表,并应用与 in 条件 ,,) 这样的语句和常用,但是如果in 后面的 1,2,3是变量怎么办呢,一般会用字符串连接的方式构造sql ...

  2. SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)

    1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地 ...

  3. 在SQL Server 2008 Management Studio中修改表字段顺序

    有时我们可能需要为一个已存在的数据库表添加字段,并且想让这个字段默认排的靠前一些,这时就需要为表字段重新进行排序,默认情况下在Management Studio中调整顺序并保存时会提示"不允 ...

  4. 在SQL Server 2018 Management Studio中修改表字段顺序

    有时我们可能需要为一个已存在的数据库表添加字段,并且想让这个字段默认排的靠前一些,这时就需要为表字段重新进行排序,默认情况下在Management Studio中调整顺序并保存时会提示“不允许保存更改 ...

  5. SQL Server 游标运用:查看所有数据库所有表大小信息(Sizes of All Tables in All Database)

    原文:SQL Server 游标运用:查看所有数据库所有表大小信息(Sizes of All Tables in All Database) 一.本文所涉及的内容(Contents) 本文所涉及的内容 ...

  6. SQL Server 2008 安装过程中遇到“性能计数器注册表配置单元一致性”检查失败 问题的解决方法

    操作步骤: 1. 在 Microsoft Windows 2003 或 Windows XP 桌面上,依次单击"开始"."运行",然后在"打开&quo ...

  7. SQL Server— 存在检测、建库、 建表、约束、外键、级联删除

    /******************************************************************************** *主题: SQL Server- 存 ...

  8. SQL SERVER 2005中如何获取日期(一个月的最后一日、上个月第一天、最后一天、一年的第一日等等)

    原文:[转]SQL SERVER 2005中如何获取日期(一个月的最后一日.上个月第一天.最后一天.一年的第一日等等) 在网上找到的一篇文章,相当不错哦O(∩_∩)O~ //C#本周第一天       ...

  9. sql server 使用链接服务器连接Oracle,openquery查询数据

      对接问题描述:不知道正式库oracle数据库账户密码,对方愿意在对方的客户端上输入账号和密码,但不告诉我们 解决方案:使用一台sql server作为中间服务器,可以通过转存数据到sql serv ...

  10. 在sql server中建存储过程,如果需要参数是一个可变集合怎么处理?

    在sql server中建存储过程,如果需要参数是一个可变集合的处理 原存储过程,@objectIds 为可变参数,比如 110,98,99 ALTER PROC [dbo].[Proc_totalS ...

随机推荐

  1. 6.Get和Post

    1.概述 URL是一个资源描述符,一个URL用于描述一个网上资源 Get用于获取/查询资源信息,Post用于更新资源信息 2.联系和区别 2.1.Get后退刷新无害,Post需要重新提交: 2.2.G ...

  2. python语法的入门

    1.变量 1.1: 底层原理:现在内存空间申请一块地址来储存变量值, 然后把申请的内存地址跟变量名绑定在一起 之后只需通过访问变量名就可以获取变量值 1.2:一个变量名只能指向一个内存地址,但是一个内 ...

  3. 写一个 Hello SpringBoot2 项目

    需求:向浏览发送/hello请求,并响应 Hello,Spring Boot 2 解决: 项目目录:controller层.Main启动项.pom.xml controller层:写好逻辑跳转,当浏览 ...

  4. ASP.NET Core - 缓存之内存缓存(下)

    话接上篇 [ASP.NET Core - 缓存之内存缓存(上)],所以这里的目录从 2.4 开始. 2.4 MemoryCacheEntryOptions MemoryCacheEntryOption ...

  5. RTSP Server(LIVE555)源码分析(三)-DESCRIBE信令

    主要分析RTSPServer::RTSPClientSession针对客户端DECCRIBE信令处理. 一.回调函数incomingRequestHandler分析 回顾一下rtsp客户端sessio ...

  6. 【python爬虫】对于微博用户发表文章内容和评论的爬取

    此博客仅作为交流学习 对于喜爱的微博用户文章内容进行爬取 (此部分在于app页面进行爬取,比较方便) 分析页面 在这里进行json方法进行,点击Network进行抓包 发现数据加载是由这个页面发出的, ...

  7. celery+Rabbit MQ简单的Demo

    介绍 一个简单的celery + rabbitmq 的搭建例子,用于记录 Celery 异步处理框架, 安装命令 pip install celery RabbitMQ 消息中间件,用来做队列 安装配 ...

  8. 2023-03-05:ffmpeg推送本地视频至lal流媒体服务器(以RTMP为例),请用go语言编写。

    2023-03-05:ffmpeg推送本地视频至lal流媒体服务器(以RTMP为例),请用go语言编写. 答案2023-03-05: 使用 github.com/moonfdd/ffmpeg-go 库 ...

  9. 2022-11-16:给你一个数组 nums,我们可以将它按一个非负整数 k 进行轮调, 例如,数组为 nums = [2,4,1,3,0], 我们按 k = 2 进行轮调后,它将变成 [1,3,0,

    2022-11-16:给你一个数组 nums,我们可以将它按一个非负整数 k 进行轮调, 例如,数组为 nums = [2,4,1,3,0], 我们按 k = 2 进行轮调后,它将变成 [1,3,0, ...

  10. Django 与 Vue 语法冲突问题完美解决方法

    Django 与 Vue 语法冲突问题完美解决方法 当我们在 django web 框架中,使用 vue 的时候,会遇到语法冲突. 因为 vue 使用 {{}}, 而 django 也使用 {{}}, ...