我要在现有表中添加一个非空列。我已经添加了可为空的列。然后,我想为现有行计算正确的值。
我有以下查询
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_REPORT
在REGISTRY_ID
和SOURCE
上具有唯一索引。我基本上希望对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
答案 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
。这将创建带有零的列,然后您可以使用其他值更新行。