1

私は2つのテーブルを持っています:

テスト1:

id int, value int, parentId int

と TEST2:

id int, value int, parentId int

TEST1 では、次のレコードを取得しました。

 id  value  parentId
 1   0      1
 2   0      1
 3   0      1

TEST2で、私は持っています:

id  value  parentId
1   0      1

複数のテーブル機能を使用して、1 回の更新で 2 つのテーブルを更新したいと考えています。目標は、TEST1 の各レコードに +1 値を追加し、parentId が TEST1 と類似している TEST2 のレコードに +1 値を追加することです。

私のクエリは次のとおりです。

UPDATE TEST1 t1
LEFT OUTER JOIN TEST2 t2 ON t1.parentId=t2.parentId
SET t1.value = t1.value + 1,
    t2.value = t2.value + 1;

その後、SELECT を実行して、TEST1 の値が更新されたことを確認します。

SELECT * FROM TEST1;

それは私に与えます:

id  value  parentId
1   1      1
2   1      1
3   1      1

私は TEST2 をチェックします:

SELECT * FROM TEST2;

それは私に与えます:

id  value  parentId
1   1      1

私が奇妙だと思うのは、TEST2 のレコードの値が 1 であることです。TEST1 の更新は 3 つのレコードで行われ、TEST2 の更新は同じレコードで 3 回行われる必要があるため、3 を期待します。

3 ではなく 1 を取得するのはなぜですか? と 3 を取得するための正しいクエリは何ですか?

編集:私も試しました:

SET @var=1;

UPDATE TEST1 t1
LEFT OUTER JOIN TEST2 t2 ON t1.parentId=t2.parentId
SET t1.value = t1.value + 1,
    t2.value = (@var:= @var + 1);

このクエリの後、 t2.value は 2 に等しくなります! そして、私が期待する4ではありません。

4

3 に答える 3

0

ここで間違っているかもしれませんが、クエリが完了するまで、更新ステートメントはt1.valueを0と見なします(クエリの実行が完了していないため)。これは予想される動作ではありませんか?

于 2011-02-10T12:18:01.240 に答える
0

LEFTOUTではなくRIGHTOUTERJOINをお試しください

于 2011-02-10T11:47:35.450 に答える
0

これはあなたが望むことをします。
あなたがしたように、TEST1とTEST2に参加しています。
TEST1 の合計集計を使用して、agg という名前のサブクエリで追加の結合を行います。

UPDATE TEST1 t1
LEFT OUTER JOIN TEST2 t2 ON t1.parentId=t2.parentId
LEFT OUTER JOIN (
  SELECT 
    parentId,
    sum(value) AS sum_v
  FROM TEST1
  GROUP BY parentId
) agg ON t1.parentId=agg.parentId
SET t1.value = t1.value + 1,
    t2.value = t2.value + agg.sum_v;
于 2011-02-10T13:06:56.723 に答える