2

この相関サブクエリを明確に表現するのが困難です。架空のテーブル foo と bar の 2 つのテーブルがあります。foo には、foo_id と total_count の 2 つのフィールドがあります。bar には、seconds と id の 2 つのフィールドがあります。

個々の ID ごとに bar の秒数を集計し、foo の total_count を更新する必要があります。id は、foo_id に対する bar の外部キーです。

私はあまり運がなくても似たようなことを試しました:

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

別の方法を提供するために、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 に答える
0

あなたの質問が正しく理解できたことを願っています。

次のテーブルがあります。

  • テーブルfoo- 列:idおよびtotal_count
  • テーブルbar- 列: foo_id(参照foo.id) およびseconds

次のクエリが機能するはずです (total_countテーブル内のすべての行を更新します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 に答える