SQL SERVER Update from 使用陷阱
原文:SQL SERVER Update from 使用陷阱
update A set from A left join B on
此方法常用来使用根据一个表更新另一个表的数据,来进行数据同步更新。若是A表行与B表行为一对一的对应关系,更新不存在问题,若是A表行与B表行对应关系为一对多的时候,需注意A表更新的列并非B表的累计值,而是第一个数值。
首先建立两个表 A,B 对A表建立触发器查看更新信息
CREATE TABLE yshA (
keyA VARCHAR(10),
value INT
)
CREATE TABLE yshB (
keyB VARCHAR(10),
valueB INT
)
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER trg_YSHA_Up
ON YSHA
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @now VARCHAR(60)
SET @now=convert(varchar,GETDATE())
SELECT *,'i',@now FROM inserted
SELECT *,'d',@now FROM deleted
END
GO
1、对数据进行更新
- 对表数据进行初始化A
INSERT INTO yshA VALUES (1,0)
INSERT INTO yshB VALUES (1,1)
INSERT INTO yshB VALUES (1,2)
SELECT * FROM yshA A LEFT JOIN yshB B ON keyA=keyB
执行结果
UPDATE A SET value = value + valueB FROM yshA A LEFT JOIN yshB B ON keyA=keyB
SELECT * FROM yshA
此执行结果理论上 value 应为3 ,实际执行 value 结果为1
- 对表数据进行初始化B
DELETE FROM yshA
DELETE FROM yshB
INSERT INTO yshA VALUES (1,0)
INSERT INTO yshB VALUES (1,2)
INSERT INTO yshB VALUES (1,1)
UPDATE A SET value = value + valueB FROM yshA A LEFT JOIN yshB B ON keyA=keyB
SELECT * FROM yshA
此方式实际执行 value 结果为2
2、 原因分析
理论上以上两种更新的结果应为一致,同样的数据 方法B更新的结果与 方法A更新的结果不一致。针对此问题进行分析,首先进行执行计划分析,查看其它的正常,但是left join 之后多了一步执行操作 Top 开销 因此可以解析为什么两次更新的结果不一致,因为只根据首条关联进行更新。
SQL SERVER Update from 使用陷阱的更多相关文章
- Oracle\MS SQL Server Update多表关联更新
原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...
- SQL Server UPDATE语句的用法详解
SQL Server UPDATE语句用于更新数据,下面就为您详细介绍SQL Server UPDATE语句语法方面的知识,希望可以让您对SQL Server UPDATE语句有更多的了解. 现实应用 ...
- sql server update时,是行锁还是表锁
https://bbs.csdn.net/topics/120000749 http://www.cnblogs.com/s021368/articles/2148659.html 问题: udpat ...
- 转,sql server update set from inner 批量修改的使用
SQL update select结合语句详解及应用 QL update select语句 最常用的update语法是: 1 2 UPDATE TABLE_NAME SET column_name ...
- sql server update....set.... from ....where....
工作中遇到的 update 的更新方法 以前update 表 set 列 = 新值 稍稍进阶 update 表 set 列 = (select 值 from 表 where ...) ...
- Invalid column name on sql server update after column create
问题:新建一个测试表xx as code into xx select * from xx 给这个表添加一个列val, val列不允许为空,将表中已有的数据val值更新为1 alter table x ...
- SQL Server Update 所有表的某一列(列名相同,类型相同)数值
); WITH T AS (SELECT SchemaName = c.TABLE_SCHEMA, TableName = c.TABLE_NAME, ColumnName = c.COLUMN_NA ...
- sql server update inner join on 的使用
假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price:另外一张表是ProductPrice表,我们要将ProductPrice表中的价格字段Price更新为Price表中 ...
- SQL Server Update 语句使用Nolock 语法
Update talblename set Column='XX' from Table TableName with(nolock) where XXX
随机推荐
- Python读取不同文件夹下的图片并且分类放到新创建的训练文件夹和标签文件夹
在深度学习的训练时,经常会碰到训练的样本数据集和标签数据集是在一个文件夹中,这个时候我们就不得不进行一些数据的预处理和文件的分类,例如将训练(training data)数据集和标签数据集(label ...
- django通用视图之TemplateView和ListView简单介绍
django支持类视图,与此同时django为我们提供了许多非常好用的通用视图供我们使用,这其中TemplateView.ListView和DetailView是我们经常使用到的,这里就对Templa ...
- HDU 4346 The Beautiful Road ( 反向考虑 思路题 )
考虑对立情况,不漂亮的串的形式必然为GGGGR……R……RGGGG 相邻R之间的距离为奇数且相等. #include <cstdio> #include <cstring> # ...
- ocrosoft Contest1316 - 信奥编程之路~~~~~第三关 问题 K: 大整数加法
http://acm.ocrosoft.com/problem.php?cid=1316&pid=10 题目描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200 ...
- 思梦PHP-阿里大鱼手机验证码
小伙伴是否做PC网站的时候,是否遇到过注册用户需要使用短信验证的功能呢?或者找回密码,以及验证用户的信息等等功能!今天思梦PHP就为大家带来ThinkPHP整合阿里大鱼短信验证的功能! 首先,我们要明 ...
- 使用IDEA新建Maven项目没有完整的项目结构(src文件夹等等)
maven还没加载好,右下角还有进度条在从中央仓库读,所以在创建maven项目的时候,需要加archetypeCatalog=internal 右边新增一项 如下图: 此时就可以快速的建立maven项 ...
- Arcgis桌面开发,Python引用GDAL库的方法
我用的是arcgis10.2,python版本是arcgis自动安装的Pythin2.7 1.下载gdal-111-1700-core.msi和对应的GDAL-1.11.1.win32-py2.7.m ...
- POJ 3907 Build Your Home | 计算多边形面积
给个多边形 计算面积 输出要四舍五入 直接用向量叉乘就好 四舍五入可以+0.5向下取整 #include<cstdio> #include<algorithm> #includ ...
- WebStrom Sass 编译配置 windows
第一步: 先安装Ruby下载 一路next 安装完成后打开开始菜单 打开后输入 gem install sass sass -v 出现版本号说明成功 第二部配置webstorm 在webstorm中s ...
- 华中农业大学第四届程序设计大赛网络同步赛 I
Problem I: Catching Dogs Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1130 Solved: 292[Submit][St ...