postgresql - Postgres - 加入更新给出了错误的结果

标签 postgresql join where-clause

我很难理解我做错了什么。 此查询的结果显示每一行的相同结果,而不是被正确的结果更新。

我的数据

我正在尝试更新一组业务的统计数据表

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 子句不起作用?

在写这个问题之前,我引用了这些帖子:a , b , c

最佳答案

执行以下操作(我总是建议不要在更新中加入)

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/

相关文章:

MySQL 计数行包括零(非常接近我想要的!)

sql - 没有 WHERE 子句的更新查询

arrays - Postgres/JSON - 更新所有数组元素

sql - ORDER BY 输出列小写

sql - PostgreSQL - 同时向多个表中插入数据

mysql用单​​个查询连接案例计数

ruby-on-rails - Rails - 显示具有来自 2 个不同连接表的交叉属性的用户

sql - 在多对多中选择与精确键的关系

mysql - mysql中如何根据另一个表从一个表中进行select