2

难以表达这个相关的子查询。我有两张虚构的桌子,foo 和 bar。foo 有 foo_id 和 total_count 两个字段。bar 有两个字段,seconds 和 id。

我需要为每个单独的 id 汇总 bar 中的秒数并更新 foo 中的 total_count。id 是 bar 中 foo_id 的外键。

我尝试过类似的事情,但运气不佳:

UPDATE foo f1 set total_count = (SELECT SUM(seconds) from bar b1 INNER JOIN foo f2     WHERE b1.foo_id = f2.id) WHERE f1.foo_id = bar.id;
4

5 回答 5

1
UPDATE foo f1
SET total_count = (SELECT SUM(seconds)
FROM bar b1 WHERE b1.id = f1.foo_id)

您应该可以在子查询中访问适当的 foo id,因此无需加入表。

于 2008-10-21T19:29:55.153 回答
1

在较大的数据集中,相关的子查询可能会占用大量资源。连接到包含适当聚合的派生表会更有效:

create table foo ( foo_id int identity, total_count int default 0 )
create table bar ( foo_id int, seconds int )

insert into foo default values
insert into foo default values
insert into foo default values

insert into bar values ( 1, 10 )
insert into bar values ( 1, 11 )
insert into bar values ( 1, 12 )
    /* total for foo_id 1 = 33 */
insert into bar values ( 2, 10 )
insert into bar values ( 2, 11 )
    /* total for foo_id 2 = 21 */
insert into bar values ( 3, 10 )
insert into bar values ( 3, 19 )
    /* total for foo_id 3 = 29 */

select *
from foo

foo_id      total_count
----------- -----------
1           0
2           0
3           0

update  f
set     total_count = sumsec
from    foo f
        inner join (
                     select foo_id
                          , sum(seconds) sumsec
                     from   bar
                     group by foo_id
                   ) a
            on f.foo_id = a.foo_id

select *
from foo

foo_id      total_count
----------- -----------
1           33
2           21
3           29
于 2008-11-07T19:15:33.153 回答
0

我希望我理解你的问题是正确的。

您有以下表格:

  • foo- 列:idtotal_count
  • bar- 列:(foo_id参考foo.id)和seconds

以下查询应该可以工作(更新total_counttable 中的所有行foo):

UPDATE foo AS f1
SET total_count = (
  SELECT SUM(seconds) 
  FROM bar INNER JOIN foo 
  WHERE foo_id = f1.id
);

我不确定您要对最后一个WHERE子句 ( WHERE f1.foo_id = bar.id;) 做什么。

于 2008-10-21T19:26:55.237 回答
0

这确实为一致性问题打开了大门。您可能会考虑创建一个视图而不是改变 foo 表:

CREATE VIEW foo AS
SELECT id, sum(seconds) from bar group by id;
于 2008-10-21T19:34:35.347 回答
0

只是为了提供一个替代方案,我喜欢使用 MySQL 漂亮的多表更新功能:

UPDATE foo SET total_count = 0;

UPDATE foo JOIN bar ON (foo.foo_id = bar.id)
  SET foo.total_count = foo.total_count + bar.seconds;
于 2008-10-21T21:18:39.520 回答