汇总“选择时更新”不会更新空值

时间:2019-06-27 14:54:17

标签: sql postgresql

我要在现有表中添加一个非空列。我已经添加了可为空的列。然后,我想为现有行计算正确的值。

我有以下查询

UPDATE FTT_REGISTRY_REPORT REP
SET COUNT_491 = SUBQUERY.CNT
FROM (
    SELECT COALESCE(COUNT(*), 0) AS CNT, REGISTRY_ID,   SOURCE
    FROM
        FTT_TX_491 OP
    GROUP BY
        REGISTRY_ID,SOURCE
    ) AS SUBQUERY
WHERE
    REP.SOURCE = SUBQUERY.SOURCE
    AND REP.REGISTRY_ID = SUBQUERY.REGISTRY_ID;

FTT_REGISTRY_REPORTREGISTRY_IDSOURCE上具有唯一索引。我基本上希望对FTT_REGISTRI_REPORT中的每个现有记录在原始表中执行COUNT查询,并将匹配相同源和注册表ID的记录数替换为报告列。

可能没有与现有FTT_REGISTRY_REPORT行匹配的记录。讨论行自身为何存在的范围超出了讨论范围(我收集了12个不同列的12个查询的统计信息)。在那种情况下,我会巧妙地尝试使用COALESCE。

但是,在执行查询之后,FTT_TX_491表中没有对应记录的很多行都得到了空值,因此无法启用非空约束。不是因为查询返回空值,而是因为行没有得到更新。请参阅解决方法。

我想了解为什么我的合并功能不起作用。理想情况下,当不存在匹配行时,子查询应计数为零或为null,然后将其计数为零。

解决方法

我设法解决了这个问题,但是仍然很乐意通过将所有行都强制为0来理解为什么它不起作用

UPDATE FTT_REGISTRY_REPORT SET COUNT_491=0;
-- My previous query

1 个答案:

答案 0 :(得分:0)

您可以使用相关子查询:

UPDATE FTT_REGISTRY_REPORT REP
    SET COUNT_491 = (SELECT COUNT(*)
                     FROM FTT_TX_491 OP
                     WHERE REP.SOURCE = SUBQUERY.SOURCE AND
                           REP.REGISTRY_ID = SUBQUERY.REGISTRY_ID
                    );

子查询将始终返回一个值。如果没有行匹配,则计数为零。

另一种方法是将列定义为NOT NULL DEFAULT 0。这将创建带有零的列,然后您可以使用其他值更新行。