SQL Server 用一张表的数据更新另一张表的数据(转载)
文章一:SQL Server中如何基于一个表的数据更新另一个表的对应数据的SQL语句脚本
https://codedefault.com/2017/sql-server-update-from-a-select
方式一 INNER JOIN
UPDATE
Table_A
SET
Table_A.col1 = Table_B.col1,
Table_A.col2 = Table_B.col2
FROM
Some_Table AS Table_A
INNER JOIN Other_Table AS Table_B
ON Table_A.id = Table_B.id
WHERE
Table_A.col3 = 'cool'
方式二 使用MERGE关键字
MERGE INTO YourTable T
USING other_table S
ON T.id = S.id
AND S.tsql = 'cool'
WHEN MATCHED THEN
UPDATE
SET col1 = S.col1,
col2 = S.col2;
或者
MERGE INTO YourTable T
USING (
SELECT id, col1, col2
FROM other_table
WHERE tsql = 'cool'
) S
ON T.id = S.id
WHEN MATCHED THEN
UPDATE
SET col1 = S.col1,
col2 = S.col2;
注: SQL Server 2008 或者以上版本才支持MERGE关键字
方式三 使用CTE
;WITH CTE
AS (SELECT T1.Col1,
T2.Col1 AS _Col1,
T1.Col2,
T2.Col2 AS _Col2
FROM T1
JOIN T2
ON T1.id = T2.id
/*Where clause added to exclude rows that are the same in both tables
Handles NULL values correctly*/
WHERE EXISTS(SELECT T1.Col1,
T1.Col2
EXCEPT
SELECT T2.Col1,
T2.Col2))
UPDATE CTE
SET Col1 = _Col1,
Col2 = _Col2
方式四 使用EXISTS
UPDATE suppliers
SET supplier_name = (SELECT customers.name
FROM customers
WHERE customers.customer_id = suppliers.supplier_id)
WHERE EXISTS (SELECT customers.name
FROM customers
WHERE customers.customer_id = suppliers.supplier_id);
文章二:SQL 用一个表的数据更新另一张表
https://blog.51cto.com/alun51cto/2392062?source=dra
用表B的数据(B1列,B2)更新表A的A1,A2列
SQL Server:
update A SET A.A1 = b.B1,A.A2=B.A2 FROM A ,B WHERE A.ID1 = B.ID1 and A.ID2 = B.ID2;
Access:
update A, B set A.A1 = B.B1,A.A2=B.B2 where A.ID1 = B.ID1 and A.ID2 = B.ID2;
--或
update A INNER JOIN B ON A.ID1 = B.ID1 AND A.ID2= B.ID2 SET A.A1 = B.B1,A.A2=B.B2;
通过一条SQL语句一次更新多条数据.SQL语句写法略有不同,如下:
方法一:
Update T1
set dc=(select dc1 from t2 where T1.A=T2.A1 AND T1.B=T2.B1)
WHERE T1.AID in (
SELECT AID FROM T1
INNER JOIN T2 ON t1.A=T2.A1 AND T1.B=T2.B1
)
注:在我标我红色的in地方如果把'in'换成'='将出错,但在下面的B种写法里就可以换成'=',变成C方法写法.
方法二:
Update T1
set dc=(select dc1 from t2 where T1.A=T2.A1 AND T1.B=T2.B1)
WHERE T1.AID in (
SELECT T1.AID FROM T2
WHERE t1.A=T2.A1 AND T1.B=T2.B1
)
方法三:
Update T1
set dc=(select dc1 from t2 where T1.A=T2.A1 AND T1.B=T2.B1)
WHERE T1.AID = (
SELECT T1.AID FROM T2
WHERE t1.A=T2.A1 AND T1.B=T2.B1
)
方法四:
Update T1
set dc=(select dc1 from T2 where T1.A=T2.A1 AND T1.B=T2.B1)
WHERE T1.A = (
SELECT T1.A FROM T2
WHERE T1.A=T2.A1 AND T1.B=T2.B1
)
方法五:
Update T1
set dc=(select dc1 from T2 where T1.A=T2.A1 AND T1.B=T2.B1)
WHERE T1.A = (
SELECT T2.A1 FROM T2
WHERE T1.A=T2.A1 AND T1.B=T2.B1
)
方法六:
Update T1
set dc=(select dc1 from T2 where T1.A=T2.A1 AND T1.B=T2.B1)
WHERE T1.A in (
SELECT T2.A1 FROM T2
WHERE T1.A=T2.A1 AND T1.B=T2.B1
)
注:如果在上面方法改写成如下的写法将会出错。
Update T1
set dc=(select dc1 from T2 where T1.A=T2.A1 AND T1.B=T2.B1)
WHERE T1.A in (
SELECT T1.A FROM T1
INNER JOIN T2 ON t1.A=T2.A1 AND T1.B=T2.B1
)
此种方法将会更新掉所有符合T1.A in ()这个条件的数据,所以是不正确的, 所以不能这样写。
方法七:
Update T1
set dc=(select dc1 from T2 where T1.A=T2.A1 AND T1.B=T2.B1 AND T1.DC=T2.DC1)
FROM T1, T2
WHERE T1.A=T2.A1 AND T1.B=T2.B1
方法八:
Update T1
set T1.dc=T2.dc1
FROM T1
INNER JOIN T2 ON T1.A=T2.A1 AND T1.B=T2.B1
WHERE t1.A=T2.A1 AND T1.B=T2.B1
方法九:
Update T1
set T1.dc=T2.dc1
FROM T1, T2
WHERE T1.A=T2.A1 AND T1.B=T2.B1
请特别注意以上方法中我用红色标记上的代码写法。
总节:虽然是一条简单的更新语名但也有多种写法,且每种写法各有优缺点。
大家是否还有更简单的写法或者更容易理解的写法?如果有请提出来一起讨论,谢谢!
说明测试环境:以上代码在MSSQL2005中验证是可行的.
注:此处我用灰色标记的部分可以去掉。
SQL Server 用一张表的数据更新另一张表的数据(转载)的更多相关文章
- SQL Server数据类型int、bigint、smallint、tinyint对比表
SQL Server数据类型int.bigint.smallint.tinyint对比表 数据类型 范围 存储 bigint -2^63 (-9,223,372,036,854,775,808) 到 ...
- SQL Update:使用一个表的数据更新另一张表
表结构 功能 用表B的数据(mc列)更新表A的mc列 SQL Server update A SET A.mc = b.mc FROM A ,B WHERE A.bmbh = B.bmbh and A ...
- SQL Update实现使用一个表的数据更新另一张表
表结构 功能 SQL Serevr Access 表结构
- SQL Server时间粒度系列----第8节位运算以及设置日历数据表节假日标志详解
本文目录列表: 1.位运算 2.设置日历数据表节假日标志 3.总结语 4.参考清单列表 位运算 SQL Server支持的按位运算符有三个,分别为:按位与(&).按位或(|).按位异或 ...
- SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析
在SQL SERVER的查询语句中使用OR是否会导致不走索引查找(Index Seek)或索引失效(堆表走全表扫描 (Table Scan).聚集索引表走聚集索引扫描(Clustered Index ...
- SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析 (转载)
在SQL SERVER的查询语句中使用OR是否会导致不走索引查找(Index Seek)或索引失效(堆表走全表扫描 (Table Scan).聚集索引表走聚集索引扫描(Clustered Index ...
- 【转发】在SQL Server中通过字段值查询存储该字段的表
-- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved. -- Purpose: To search all colu ...
- SQL Server中数据库文件的存放方式,文件和文件组 (转载)
简介 在SQL SERVER中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,仅仅是几个文件而已.SQL SERVER通过管理逻辑上的文件组的方式来管理文件.理解文件和文 ...
- SQL Server 2008 R2【SET ANSI_PADDING填充属性】插入一条数据后,为何每一列都默认的在字符后多了几个空格
当加入空格后查出 解决: 导致出现这样的现象的原因就是SET ANSI_PADDING选项. 这个选项只在数据表的字符串字段被更新或者新的数据行插入到表中的时候作用.它控制着SQL Server在遇到 ...
随机推荐
- Python 技术篇-pip版本查看和升级
一.pip show pip查看pip版本,下面还提示安装命令和pip可以升级到的最新版本. 二.python -m pip install --upgrade pip升级我们的pip
- java读取IFC文件
The IFC JAVA Toolbox can read IFC STEP files and IFCZIP files from any data source that implementsja ...
- 给kali的Metasploit下添加一个新的exploit
转载:https://blog.csdn.net/SilverMagic/article/details/40978081 首先在/usr/share/metasploit-framework/mod ...
- Jmeter(一) Jmeter基本使用
1.下载安装 官方网站 https://jmeter.apache.org/download_jmeter.cgi 选择下载即可 2.基本使用 下载解压后,目录如下: 进入到bin目录, 双击jmet ...
- npx vs npm
npx vs npm npx 使用教程
- JVM中的逃逸分析
逃逸分析(Escape Analysis)是目前Java虚拟机中比较前沿的优化技术. 逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递 ...
- C 语言 基础篇
1.机器语言 2.汇编语言 3.高级语言:C.C++.Java(基于虚拟机) C语言开发:Unix,Linux,Mac OS,iOS,Android,Windows,Ubuntu 开发环境:visua ...
- python_并发与通信
独立的进程内存空间与共享的服务器进程空间 知识点一: 进程间通信的限制 进程是独立的,互不干扰的独立内存空间我们想不能修改变量但是,深层次问题是,这个进程与那个进程完全失去了联系 import mul ...
- CapsLock Enhancement via AutoHotKey
上次写了一篇博文,讲如何通过AutoHotKey改造CaspLock,使其成为一个方便的编辑按键,并特意给出了设计的思路方便参考. 见地址:http://www.cnblogs.com/Vonng/p ...
- Spring MVC之@ControllerAdvice详解
本文链接:https://blog.csdn.net/zxfryp909012366/article/details/82955259 对于@ControllerAdvice,我们比较熟知的用法是 ...