- 发帖可能变空内容,邪门暂不知所以然
- 『稷下学宫』新认证方式,24年网站打算和努力目标
主题:【求助】SQL怎样用一个表中的信息来更新另外一个表 -- 铁手
最近碰到一个道理、逻辑都讲的通,但是实际上行不通的问题。请大家帮忙看看是怎么一回事。
数据库中两个表,一个 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中的值一一对应。逻辑上感觉第一个语句简单明了。哪位帮忙给解释一下?或者有没有别的方式可以实现需要的效果?
SUM: number
GROUP_CONCAT: text
数据库我不怎么接触的,所以没啥好经验来着。
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
因而必须先对A表进行求和汇总后,才能更新B表。
where B.ID=A.ID 仅仅是一个Join操作而已。
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;
不知道用的什么数据库,用触发器可以在一个表更新数据后自动更新关联表的数据,具体请google,呵呵。
直接从表A生成表B不行吗?
select id,sum(points) from A group by id
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里的函数。