Power Query无需合并即可用另一表数据替换当前表对应列值的实现方法
Power Query 无合并操作跨表替换同名列值方案
首先确认前提:两张表需存在唯一关联主键列(例如订单编号、产品ID等可唯一匹配对应行的公共列),以下两种方案均无需使用合并查询+展开列的操作。
方案1:单/少列替换(界面操作为主)
步骤1:制作OQC表匹配查询
新建空白查询,输入以下M代码,替换对应参数后命名为OQC匹配字典:
let // 替换为你的实际关联主键列名、OQC表查询名 主键列 = "你的关联主键列名", 源 = OQC表, 转记录 = Record.FromList(Table.ToRecords(源), List.Transform(Table.Column(源, 主键列), Text.From)) in 转记录
步骤2:替换目标表对应列
打开需要修改的结果表查询,按以下操作执行:
- 依次点击【添加列】→【自定义列】
- 输入自定义列公式(以替换「检验结果」列为例):
= try OQC匹配字典[Text.From([你的关联主键列])][检验结果] otherwise [检验结果] - 删除原有的旧「检验结果」列,将新生成的自定义列重命名为「检验结果」即可
- 需替换多列时重复上述添加自定义列的操作即可
方案2:批量替换所有同名列(高效M代码实现)
如果需要替换的同名列数量较多,直接给结果表查询新增一个步骤,替换以下代码中的对应参数即可一次性完成所有同名列的替换:
let // --------------替换为你的实际参数-------------- 关联主键列 = "订单编号", OQC表查询名 = OQC表, 目标结果表 = 你的结果表查询名, // -------------------------------------------- // 自动提取两张表的公共列,排除主键列无需替换 待替换列 = List.RemoveItems(List.Intersect({Table.ColumnNames(OQC表查询名), Table.ColumnNames(目标结果表)}), {关联主键列}), // 缓冲OQC表提升匹配效率 OQC缓冲 = Table.Buffer(Table.SelectColumns(OQC表查询名, 待替换列 & {关联主键列})), 匹配字典 = Record.FromList(Table.ToRecords(OQC缓冲), List.Transform(Table.Column(OQC缓冲, 关联主键列), Text.From)), // 逐行匹配替换 替换后行 = Table.TransformRows(目标结果表, (row) => let 当前主键 = Text.From(Record.Field(row, 关联主键列)), 匹配数据 = if Record.HasFields(匹配字典, 当前主键) then 匹配字典[当前主键] else [] in Record.ReplaceFields(row, 匹配数据) ), 输出表 = Table.FromRecords(替换后行, Value.Type(目标结果表)) in 输出表
方案优势
- 全程无合并、无展开列操作
- 自动识别所有同名列批量替换,无需逐列设置
- 无匹配行时自动保留目标表原值,不会出现空值错误
- 缓冲后的匹配效率远高于合并查询,适合大数据量场景
内容的提问来源于stack exchange,提问作者Mateusz
相关产品推荐
相关产品推荐

