如何在TypeORM中提取最早日期并精准更新指定数据
TypeORM按分组筛选最早日期并精准更新的实现方案
问题场景
现有数据表数据如下:
col date a 2021-07-26 00:00:00 a 2021-07-27 00:00:00 c 2021-07-26 00:00:00 d 2021-07-27 00:00:00
需实现:保留col='a'的最早日期记录,仅更新该分组下其他记录的date字段为2022-09-30,预期结果:
col date a 2021-07-26 00:00:00 a 2021-09-30 00:00:00 c 2021-07-26 00:00:00 d 2021-07-27 00:00:00
原更新代码因未正确筛选目标记录,导致col='a'的所有记录都被修改,以下是两种可行的解决方案:
方案一:使用子查询(单SQL原子操作)
通过子查询直接获取col='a'分组的最早日期,在更新时排除该日期对应的记录:
await getRepository(PricingPattern) .createQueryBuilder() .update({ date: '2022-09-30' }) .where("col = :col", { col: 'a' }) // 子查询获取该分组的最小日期,排除此记录 .andWhere("date != (SELECT MIN(date) FROM pricing_pattern WHERE col = :col)", { col: 'a' }) .execute();
注意:pricing_pattern需替换为你的PricingPattern实体对应的数据库表名(若实体通过@Table()指定了表名,需用指定的名称)。
方案二:分两步查询(直观易维护)
先查询出目标分组的最早日期,再基于该日期执行更新操作:
// 第一步:获取col='a'的最早日期 const earliestResult = await getRepository(PricingPattern) .createQueryBuilder() .select("MIN(date)", "earliestDate") .where({ col: 'a' }) .getRawOne(); // 第二步:更新排除最早日期的记录 await getRepository(PricingPattern) .createQueryBuilder() .update({ date: '2022-09-30' }) .where({ col: 'a' }) .andWhere("date != :earliestDate", { earliestDate: earliestResult.earliestDate }) .execute();
原代码错误原因
原代码的where条件未正确筛选出非最早日期的记录,导致所有col='a'的记录都被匹配并更新。上述两种方案通过明确排除分组内的最早日期记录,实现了精准更新。
内容的提问来源于stack exchange,提问作者Heisenberg
相关产品推荐
相关产品推荐

