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
随机推荐
- hdu 1203 01背包 I need a offer
hdu 1203 01背包 I need a offer 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203 题目大意:给你每个学校得到offe ...
- fragment中的WebView返回上一页
public final class Text1Fm extends Fragment { static WebView mWeb; private View mContentView; privat ...
- 基于eclipse创建maven工程
一.创建项目 1.Eclipse中用Maven创建项目 上图中Next 2.继续Next 3.选maven-archetype-webapp后,next 4.填写相应的信息,Packaged是默认创建 ...
- zoj 1002 Fire Net (二分匹配)
Fire Net Time Limit: 2 Seconds Memory Limit: 65536 KB Suppose that we have a square city with s ...
- 论文笔记《Deep Hand: How to Train a CNN on 1 Million Hand Images When Your Data Is Continuous and Weakly Labelled》
一.概述 这个是最近的核心工作了,基本上都是靠着这篇paper的model过日子了啊.. 论文主要讲的是hand gesture recognition,实际上是用googlenet做的一个class ...
- 蓝萝卜blu netty3升netty4
老项目是netty3的,本来想直接改到netty5,但是netty5居然是只支持jdk1.7,很奇怪jdk1.6和jdk1.8都不行..为了兼容jdk1.6加上netty4本来和netty5就差别不大 ...
- .ini配置读取
ini文件的格式 格式 INI文件由节.键.值组成. 节 [section] 参数(键=值) name=value 注解 注解使用分号表示(;).在分号后面的文字,直到该行结尾都全部为注解. ...
- Hoof, Paper, Scissors(USACO)
题目大意: 一种游戏(类似于石头剪刀布):两个人分别给出一个字母,然后比较:H>S,S>P,P>H,我们已知对手的字母顺序,求在前n局中我们最多能赢多少次. 由于出字母的人非常懒,所 ...
- 和菜鸟一起学linux之V4L2摄像头应用流程【转】
转自:http://blog.csdn.net/eastmoon502136/article/details/8190262/ 上篇文章,知道了,C代码编译后存放在内存中的位置,那么C代码的整个编译过 ...
- Flask学习总结笔记推荐
https://blog.csdn.net/kikaylee/article/category/6551426