我有两张 table :
TEST1:
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
我想使用多表功能在一次更新中更新两个表 . 目标是将TEST1的每个记录添加1个值,将1个值添加到TEST2中的记录,其中parentId类似于TEST1 .
我的查询是:
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的更新应该在同一条记录上发生三次 .
为什么我获得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 .
3 回答
请尝试RIGHT OUTER JOIN而不是LEFT OUT
也许我在这里错了,但是在查询完成之前,你的update语句会将t1.value视为0(因为你的查询还没有完成执行),这是预期的行为,不是吗?
这会做你想要的 .
它正如你所做的那样加入TEST1和TEST2 .
通过TEST1上的和聚合在名为agg的子查询上进行额外连接 .