SQL同时更新两张表中关联数据方法

文章标题比较难理解,先让我举个例子,解释一下要实现的操作。

有两张表,t_statistics、t_add,如下

t_statistics数据

t_add数据

现在需要将 t_statistics 表 addtotal 字段的值减去 t_add 表 total 字段的值,条件是两者有相同的 id,所以正确的操作之后,t_add 记录无变化,t_statistics 记录如下

测试的数据库为Oracle(Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – 64bi)和MySQL(5.5.25)

0、Oracle

常见的写法

update t_statistics ts
   set ts.addtotal =
       (select ts.addtotal - ta.total from t_add ta where ts.id = ta.id)
执行完之后的结果为

t_statistics错误修改后数据

震惊之后Google…如这篇文章所说

这是因为在oracle的update语句中如果不写where子句,oracle将会默认的把所有的值全部更新,即使你这里使用了子查询并且某在值并不能在子查询里找到,你就会想当然的以为,oracle或许将会跳过这些值吧,你错了,oracle将会把该行的值更新为空。

修改成如下语句,DONE

update t_statistics ts
   set ts.addtotal =
       (select ts.addtotal - ta.total from t_add ta where ts.id = ta.id)
 where exists (select 1 from t_add where t_add.id = ts.id)

1、MySQL

有两种写法,第一种写法同上

 

UPDATE t_statistics ts SET
ts.addtotal =
      (SELECT ts.addtotal - ta.total FROM t_add ta WHERE ts.id = ta.id)
WHERE EXISTS (SELECT 1 FROM t_add WHERE t_add.id = ts.id)
同样的,如果不写 where exists 子句,也会造成1004、1005记录addtotal字段被update成NULL

另一种更简单的

UPDATE t_statistics ts,
       (SELECT a.id, s.addtotal - a.total AS result
          FROM t_add a, t_statistics s
         WHERE a.id = s.id) t
   SET ts.addtotal = t.result
 WHERE ts.id = t.id

同样可以实现,不过这种方法只在MySQL中有效,Oracle中执行会报错误

sqlserver

一、当用一个表中的数据来更新另一个表中的数据,T-SQL提供多种写法(下面列出了二种),但建议用第一种写法,虽然传统,但结构清晰。

并且要注意,当用一个表中的数据来更新另一个表中的数据时,二个表一定要有关联!
1.
update t1
    set t1.c2 = t2.c2
   fro m t2
where t1.c1 = t2.c1
2.
Update t1
    set t1.c2 = t2.c2
fro m t1 inner join t2
    on t1.c1 = t2.c1

二、FROM 子句中指定的表的别名不能作为 SET column_name 子句中被修改字段的限定符使用。

  例如,下面的内容无效:
UPDATE titles
SET t.ytd_sales = t.ytd_sales + s.qty
FROM titles t, sales s
WHERE t.title_id = s.title_id
AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)

若要使上例合法,请从列名中删除别名 t 或使用本身的表名。

1.

UPDATE titles
SET ytd_sales = t.ytd_sales + s.qty
FROM titles t, sales s
WHERE t.title_id = s.title_id
AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)

2.

UPDATE titles
SET titles.ytd_sales = t.ytd_sales + s.qty
FROM titles t, sales s
WHERE t.title_id = s.title_id
AND s.ord_date = (SELECT MAX(sales.ord_date) FROM sales)

时间: 2024-09-03 04:53:34

SQL同时更新两张表中关联数据方法的相关文章

sql语句-如何用SQL语句实现两张表(无关联)查询后,分别将各自的一个字段,插入一个新表。

问题描述 如何用SQL语句实现两张表(无关联)查询后,分别将各自的一个字段,插入一个新表. 有A.B.C三张表如下, 表 A 表B 学生ID(主键) 学生名称 课程ID(主键)| 课程名称 表 C 学生ID 课程ID (联合主键) 那么,通过SQL语句操作如何用学生姓名和课程名(只能获取学生姓名和课程名)将课程ID和学生ID插入到C表(C表中有课程ID和学生ID并且是联合主键),感激不尽. 解决方案 你可以定义2个变量,分别从表A表B用名称查询到ID.在表C的新增语句中使用这2个变量. 不过你这

更新表-sql 如何在建立一个存储过程时更新两张表的数据?

问题描述 sql 如何在建立一个存储过程时更新两张表的数据? create proc proc2 ( @OrderID int, @BookID varchar(20),--更新 orderInfo quantity:更新 orderSheet payment @BookStock int ) as update orderSheet set payment = b.newpay FROM orderInfo,orderSheet,(select (payment + price * @Book

数据库SQL,将两张表合并为一张表

问题描述 数据库SQL,将两张表合并为一张表 将表table1.table2合并为表table3 table1: id name value 1 阅读 5 1 视频 7 1 游戏 7 2 阅读 1 2 游戏 3 table2 id name value 1 阅读 8 1 视频 9 1 游戏 2 2 阅读 11 3 视频 4 table3: id name value1 value2 1 阅读 5 8 1 视频 7 9 1 游戏 7 2 2 阅读 1 11 2 游戏 3 0 3 视频 0 4 解决

mybatis-Spring+Mybatis从两张表中取值并传值到页面 分页

问题描述 Spring+Mybatis从两张表中取值并传值到页面 分页 我写的Dao //根据登陆ID查询直属下属 (分页) List> findByid(String id,RowBounds rowBounds); 对应的mapper SELECT u.user_code,a.totasalar from c_user_info u JOIN c_attence_info aON u.id=a.relatedid where department=(SELECT department FRO

jsp-mysql 同时从一数据库的两张表中读取最新插入放入数据怎么做到?

问题描述 mysql 同时从一数据库的两张表中读取最新插入放入数据怎么做到? 现在有两张表ab.表a中有数据a1,a2a3:表b中有数据b1b2b3.现在得到a,b中的最新数据a1,a2b1b2.这个要怎么做?

dropdownlist-DropDownList获取两个表中的数据!!

问题描述 DropDownList获取两个表中的数据!! 我做的是一个员工管理系统!现在的问题是我现在添加一个部门,想要让他自动显示在我新建员工的部门DropDownList里面 解决方案 DropDownList datasource 重新绑定下数据.或者 dropdownlist item add 添加新的部门数据.

在Oracle数据库中同时更新两张表的简单方法_oracle

以前只会写一些简单的updaet语句,比如updae table set c1='XXX' 之类的 今天遇到一个数据订正的问题,项目背景如下,有个表A,有两个字段a1,a2还有一个关联表B,其中也有两个字段,b1和b2.其中a2和b2是关联的,想把A中的字段a1更新成B中的b1 理论上sql应该挺好写的,但是在oralce中实现了半天一直报语法错误.而且确实还有些小小细节没有注意到. 首先上测试数据 表1,ZZ_TEST1 表2,ZZ_TEST2 要把表一的text更新成表二的text1值,对应

数据库中两张表之间的数据同步增加、删除与更新实现思路_MsSql

分别创建增加.删除.更新的触发器(Trigger)来达到两张表之间数据同步的目的. 1:数据同步增加: 如有两张表--A表和B表,创建触发器使当A表插入数据后B表也同步插入数据.其中B表插入数据的字段需要同A表中的字段相对应. 复制代码 代码如下: CREATE TRIGGER 触发器名称 ON A表 AFTER INSERT AS BEGIN INSERT INTO B表(B表字段1,B表字段2,B表字段3) SELECT A表字段1,A表字段2,A表字段3 FROM INSERTED END

两张表中添加一天一条记录 求大神 帮忙看下 sql 语句该如何去写

问题描述 求大神帮忙解决一个问题比如说有三张表A,B,C三张表,我想将A中的某条数据点击添加按钮的时候同时加到B和C两张表,如何添加?A和B是一对多关系B和C是一对多关系sql语句该如何去写 解决方案 解决方案二:分开逻辑写呗.解决方案三:用触发器可以吗解决方案四:触发器没经常用,的忘记中写了解决方案五:还有其他办法吗