我有两张桌子,Dtable d和Rtable r。我想按以下顺序用一个查询(重要!)更新两个表:首先使用Rtable中的值设置所有Dtable匹配行值。然后 - 从Rtable更改值。在Rtable中,将始终存在与键匹配的记录,但在Dtable中,可以有0,1或许多与键匹配的记录。我想出了以下选择:
UPDATE Dtable d, Rtable r
SET
d.value = r.value,
r.value = 0
WHERE
d.key = 403 AND d.value = 0 AND r.id = 403
但问题是,如果我在Dtable中有多个匹配键的记录,只有第一个记录从Rtable更新值,然后Rtable的值发生变化,Dtable的第二行已经从更改后的值更新Rtable,这不是我想要的。
以下是更新前两个表的内容示例:
Dtable Rtable
--------------- ---------------
| key | value | | key | value |
--------------- ---------------
| 403 | 0 | | 403 | 105 |
--------------- ---------------
| 403 | 0 |
---------------
这就是我希望它在更新后的目的:
Dtable Rtable
--------------- ---------------
| key | value | | key | value |
--------------- ---------------
| 403 | 105 | | 403 | 0 |
--------------- ---------------
| 403 | 105 |
---------------
有什么建议吗?感谢
答案 0 :(得分:0)
看看这是否让你更接近:
UPDATE Dtable s, Rtable r
SET s.value = r.value,
r.value = 0
FROM Rtable r
JOIN Dtable d
ON r.key = d.key
WHERE d.key = 403;
答案 1 :(得分:0)
试试这个 -
public class UserService extends HystrixCommand<Boolean> {
private final User user;
public User getUserById(String id) {
super(HystrixCommandGroupKey.Factory.asKey("AnyUser"));
user = storage.get(id);
return user;
}
public void update(User user) { // SET
super(HystrixCommandGroupKey.Factory.asKey("AnyUser"));
this.user = user;
storage.put(user.getId(), user);
}
@Override
protected Boolean run() {
return user == null || (user != null && user.id == 0);
}
@Override
protected String getCacheKey() {
return (user != null ) ?String.valueOf(user.id):"";
}
}