1

我有两张桌子:

测试1:

id int, value int, parentId int

和测试2:

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

我想使用多表功能一次更新两个表。目标是为 TEST1 的每条记录添加 +1 值,并为 TEST2 中 parentId 与 TEST1 相似的记录添加 +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;

之后,我进行选择以检查 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。我希望 3 因为 TEST1 的更新是在 3 条记录上,所以 TEST2 的更新应该在同一条记录上发生 3 次。

为什么我获得 1 而不是 3 ?获得 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

这会做你想要的。
它像你一样加入了 TEST1 和 TEST2 。
在名为 agg 的子查询上附加连接,并在 TEST1 上进行总和聚合。

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 回答
0

也许我在这里错了,但是在查询完成之前,您的更新语句将 t1.value 视为 0(因为您的查询尚未完成执行),这不是预期的行为吗?

于 2011-02-10T12:18:01.240 回答
0

请尝试 RIGHT OUTER JOIN 而不是 LEFT OUT

于 2011-02-10T11:47:35.450 回答