主题:【求助】SQL怎样用一个表中的信息来更新另外一个表 -- 铁手

大河奔流 导读 复 10 阅 19174

/ 1 首页 上页 下页 末页

O 【求助】SQL怎样用一个表中的信息来更新另外一个表 3 铁手 字1502 2016-04-08 15:02:55
O 我用MySQL也只能方法B,只能SUM/GROUPCON 1 脊梁硬 字30 2016-04-08 19:57:29
O 不是太懂。这种情况是不是应该join起来? 文青 字0 2016-04-09 08:42:54
O 试试先Group By,然后再Update 1 红茶冰 字206 2016-04-09 11:18:17
O 这样即可 2 坚持的阿甘 字120 2016-04-09 19:54:10
O Update 的本质是Select操作 honeybl 字116 2016-04-18 21:01:05
O mysql必须子查询,比如方法B 混沌之源 字0 2016-04-20 00:12:04
O 试试 1 四四方方 字768 2016-04-20 15:32:38
O 可以用触发器自动更新 1 warmanky 字138 2016-04-21 05:45:38
O 只会简单的语句 1 jienong 字76 2016-04-22 20:05:15
O 子查询更新 1 我是人间惆怅客 字249 2016-06-11 03:02:58
2016-04-08 15:02:55
主题:4189313
铁手
铁手`352`/bbsIMG/upload/face/352.gif`70`46700`40909`506556`正九品上:儒林郎|仁勇校尉`2003-05-03 11:59:57`
【求助】SQL怎样用一个表中的信息来更新另外一个表 3

最近碰到一个道理、逻辑都讲的通,但是实际上行不通的问题。请大家帮忙看看是怎么一回事。

数据库中两个表,一个 A 一个B,A 和B有一定关联性。准备通过这个关联性来把B中的数据更新到A中。为简化,举例如下。

表A两个字段:ID,Points 表B两个字段:ID,Total

表A中有如下数据

ID Points
12 1
12 2
12 3
12 4
13 11
13 12
13 13
13 14

表B中有如下数据

ID Total
12 0
13 0

我想把表A中的Points值更新到表B中相对应的ID行中,在上面这个例子里,就是把表B中ID=12的Total值更新为 10 (1+2+3+4),ID=13的Total值更新为 50 (11+12+13+14)。

直觉和道理上来说,用下面的SQL语句:

UPDATE B,A SET B.Total=B.Total+A.Points WHERE B.ID=A.ID

结果是表B中,ID=12的Total值是1,ID=13的Total值为11,也就是只加了表A中的第一个,后面的值都没有加上。

后来用下面的语句就对了:

UPDATE B,(SELECT ID,SUM(Points) AS SumP FROM A GROUP BY ID) AS C SET B.Total=B.Total+C.SumP WHERE B.ID=C.ID

语句显得有些复杂,而且执行过程中还要弄出个临时表。

基本上看起来 UPDATE A,B 这样的语句需要 A和B中的值一一对应。逻辑上感觉第一个语句简单明了。哪位帮忙给解释一下?或者有没有别的方式可以实现需要的效果?


关键词(Tags): #更新多表#SQL
2016-04-08 15:02:55
4189335 复 4189313
脊梁硬
我用MySQL也只能方法B,只能SUM/GROUPCON 1

SUM: number

GROUP_CONCAT: text


2016-04-08 19:57:29
4189409 复 4189313
文青
不是太懂。这种情况是不是应该join起来?

2016-04-09 08:42:54
2016-04-09 11:18:17
4189430 复 4189313
红茶冰
红茶冰`102716`http://2.im.guokr.com/RG5ZIDMPGbCXLYR_OR1TvZ3Fe9HtL6SJGdq1tPMHcqf6AAAAlgAAAEdJ.gif`70`1568`2996`28098`正四品下:通议大夫|壮武将军`2014-12-09 14:22:56`
试试先Group By,然后再Update 1

数据库我不怎么接触的,所以没啥好经验来着。

SQL GROUP BY


2016-04-09 11:18:17
2016-04-09 19:54:10
4189480 复 4189313
坚持的阿甘
坚持的阿甘`17847`/bbsIMG/face/0007.gif`70`4085`139`18763`从五品上:朝请大夫|游骑将军`2007-05-29 02:17:08`
这样即可 2

update 表B set total=b.total

from 表B aa,(select ID,sum(points) as points from 表a GROUP BY id) bb

where aa.id=bb.id


2016-04-09 19:54:10
2016-04-18 21:01:05
4190619 复 4189313
honeyblhoneybl`31353`/bbsIMG/face/0000.gif`70`424`481`5456`从八品上:承奉郎|御武(侮)校尉`2009-01-30 04:47:27`
Update 的本质是Select操作

因而必须先对A表进行求和汇总后,才能更新B表。

where B.ID=A.ID 仅仅是一个Join操作而已。


2016-04-18 21:01:05
2016-04-20 15:32:38
4190906 复 4189313
四四方方四四方方`6664`/bbsIMG/face/0012.gif`70`5242`165`22630`正五品上:中散大夫|定远将军`2005-05-10 20:21:20`
试试 1

create table t1 (

id number(2),

point number(4)

)

;

create table t2 (

id number(2),

total number(4)

)

;

insert into t1 values (12, 1);

insert into t1 values (12, 2);

insert into t1 values (12, 3);

insert into t1 values (12, 4);

insert into t1 values (13, 11);

insert into t1 values (13, 12);

insert into t1 values (13, 13);

insert into t1 values (13, 14);

select * from t1;

=========

id point

=========

12 1

12 2

12 3

12 4

13 11

13 12

13 13

13 14

insert into t2 values (12, 0);

insert into t2 values (13, 0);

select * from t2;

=========

id total

=========

12 0

13 0

update t2 a set total = (select sum(point) from t1 b where b.id = a.id group by a.id);

select * from t2;

=========

id total

=========

12 10

13 50

drop table t1 purge;

drop table t2 purge;


2016-04-20 15:32:38
2016-04-21 05:45:38
4190964 复 4189313
warmankywarmanky`55528`/bbsIMG/face/0000.gif`70`35`35`419`从九品上:文林郎|陪戎校尉`2010-04-20 20:09:43`
可以用触发器自动更新 1

不知道用的什么数据库,用触发器可以在一个表更新数据后自动更新关联表的数据,具体请google,呵呵。


2016-04-21 05:45:38
4191218 复 4189313
jienong
只会简单的语句 1

直接从表A生成表B不行吗?

select id,sum(points) from A group by id


2016-04-22 20:05:15
2016-06-11 03:02:58
4198247 复 4189313
我是人间惆怅客我是人间惆怅客`48057`/bbsIMG/face/0000.gif`70`2`7`86`从九品上:文林郎|陪戎校尉`2009-11-26 07:05:23`
子查询更新 1

UPDATE B

SET B.Total=isnull((select sum(points) from A where A.id=B.id),0)

或者

UPDATE B

SET B.Total=isnull(t.s_points,0)

from B

left join

(select ID, sum(points) as s_points from A) t

where B.id = t.ID

注:上面isnull是mssql里的函数。


2016-06-11 03:02:58
帖内引用

/ 1 首页 上页 下页 末页