【sql同时更新两张表中关联数据库】SQL同时更新两张表中关联数据方法

更新时间:2019-11-17    来源:今天更新    手机版     字体:

【www.bbyears.com--今天更新】


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

有两张表,t_statistics、t_add,如下

t_statistics数据

t_statistics数据

t_add数据

t_add数据

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

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)

本文来源:http://www.bbyears.com/jintiangengxin/79792.html

热门标签

更多>>

本类排行