Postgres SCD Type 1程序误更新全部行,非匹配行被置空求修正
修正PostgreSQL SCD Type 1更新异常问题
你的UPDATE语句未添加过滤条件,导致所有行都会执行SET操作。当TABLETOBEUPDATED中的ID在TABLEB中不存在时,子查询返回NULL,这些行的Y字段就会被置为NULL,不符合仅更新匹配行的需求。
解决方案1:添加WHERE EXISTS过滤条件
通过WHERE EXISTS限定仅更新ID在TABLEB中存在的行,不匹配的行保持原数据不变:
UPDATE "TEST"."TABLETOBEUPDATED" SET "Y" = ( SELECT "NEWY" FROM "TEST"."TABLEB" WHERE "TABLETOBEUPDATED"."ID" = "TABLEB"."ID" ) WHERE EXISTS ( SELECT 1 FROM "TEST"."TABLEB" WHERE "TABLETOBEUPDATED"."ID" = "TABLEB"."ID" );
解决方案2:使用FROM JOIN方式更新(推荐,性能更优)
通过JOIN直接关联两张表,仅更新匹配ID的行,逻辑更清晰,适合大数据量场景:
UPDATE "TEST"."TABLETOBEUPDATED" t SET "Y" = b."NEWY" FROM "TEST"."TABLEB" b WHERE t."ID" = b."ID";
执行上述任意一种修正后的语句后,查询结果会符合预期:ID1-5的Y字段更新为TABLEB中的对应值,ID=6的Y字段保留原值80。
内容的提问来源于stack exchange,提问作者wltay04
相关产品推荐
相关产品推荐

