MS Access中带模式匹配的UPDATE查询无法更新所有匹配值问题咨询
适配MS Access的纯SQL实现方案
可以仅通过SQL实现全量匹配更新,通用写法如下:
单规则匹配(无多规则命中冲突场景)
UPDATE main SET main.type = DLookup("value", "incoming", "'" & Replace(main.name, "'", "''") & "' LIKE [key]") WHERE EXISTS ( SELECT 1 FROM incoming WHERE main.name LIKE incoming.key );
如果不需要保留无匹配记录的原有type值,希望无匹配时type置为Null,可以直接删除WHERE EXISTS语句块。
多规则命中优先级处理场景
如果存在同一main.name可命中多条incoming.key规则的情况,可先给incoming表新增数值型priority字段(数值越大匹配优先级越高),再使用以下纯标准SQL写法:
UPDATE main SET main.type = ( SELECT TOP 1 incoming.value FROM incoming WHERE main.name LIKE incoming.key ORDER BY incoming.priority DESC ) WHERE EXISTS ( SELECT 1 FROM incoming WHERE main.name LIKE incoming.key );
原写法失效原因
- Access的JOIN型UPDATE要求关联行集与主表为一对一对应,使用
LIKE作为关联条件时,查询优化器会错误判定匹配关系,仅更新第一个命中规则的主表记录,后续匹配行会被判定为已处理直接跳过 - 未做行级绑定的SET嵌套子查询写法,会触发优化器的全局匹配逻辑,仅返回第一个匹配的规则值应用到所有行,导致非预期更新结果
注意事项
- 若
name字段存在单引号,Replace函数会自动转义避免SQL语法报错 - 若规则需要匹配实际的
*通配符本身,可在LIKE子句后添加ESCAPE '\',规则中的实际*写为\*即可完成转义匹配
内容的提问来源于stack exchange,提问作者PipperChip
相关产品推荐
相关产品推荐

