我很难理解我做错了什么。 此查询的结果显示每一行的相同结果,而不是被正确的结果更新。
我的数据
我正在尝试更新一组业务的统计数据表
business_stats ( id SERIAL,
pk integer not null,
b_total integer,
PRIMARY KEY(pk)
);
每个业务的详细信息都存储在这里
business_details (id SERIAL,
category CHARACTER VARYING,
feature_a CHARACTER VARYING,
feature_b CHARACTER VARYING,
feature_c CHARACTER VARYING
);
这里是一个将pk 与类别 相关联的表
datasets (id SERIAL,
pk integer not null,
category CHARACTER VARYING;
PRIMARY KEY(pk)
);
我做了什么(错误的)
UPDATE business_stats
SET b_total = agg.total
FROM business_stats b,
( SELECT d.pk, count(bd.id) total
FROM business_details AS bd
INNER JOIN datasets AS d
ON bd.category = d.category
GROUP BY d.pk
) agg
WHERE b.pk = agg.pk;
这个查询的结果是
| id | pk | b_total |
+----+----+-----------+
| 1 | 14 | 273611 |
| 2 | 15 | 273611 |
| 3 | 16 | 273611 |
| 4 | 17 | 273611 |
但如果我只运行 SELECT,每个 pk 的结果将完全不同
| pk | agg.total |
+----+-------------+
| 14 | 273611 |
| 15 | 407802 |
| 16 | 179996 |
| 17 | 815580 |
问题
- 为什么会这样?
- 为什么 WHERE 子句不起作用?
最佳答案
执行以下操作(我总是建议不要在更新中加入)
UPDATE business_stats bs
SET b_total =
( SELECT count(c.id) total
FROM business_details AS bd
INNER JOIN datasets AS d
ON bd.category = d.category
where d.pk=bs.pk
)
/*optional*/
where exists (SELECT *
FROM business_details AS bd
INNER JOIN datasets AS d
ON bd.category = d.category
where d.pk=bs.pk)
关于postgresql - Postgres - 加入更新给出了错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43455859/