You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerQuery条件NestedJoin:如何统一获取ParentTable数据?

PowerQuery 统一获取关联ParentTable数据解决方案

核心思路

先把ChildTable与ParentTable预关联,让每个Child记录携带对应的Parent数据;再将原表格分别与预处理后的Child表、Parent表进行关联;最后通过判断关联结果是否为空,统一提取有效Parent数据并展开。

分步实现(含代码示例)

假设:

  • 原表格名为Source,目标数字列名为TargetNum
  • ParentTable主键列名为ParentPK,需获取的Parent数据列是ParentTable的所有列
  • ChildTable主键列名为ChildPK,关联Parent的外键列名为ParentTableFK
  1. 预处理ChildTable:关联对应Parent数据
    先给ChildTable的每条记录绑定其对应的Parent数据,避免后续二次关联:

    ChildWithParent = Table.NestedJoin(
        ChildTable, 
        {"ParentTableFK"}, 
        ParentTable, 
        {"ParentPK"}, 
        "ParentData", 
        JoinKind.LeftOuter
    ),
    ChildWithParentExpanded = Table.ExpandTableColumn(ChildWithParent, "ParentData", Table.ColumnNames(ParentTable), Table.ColumnNames(ParentTable))
    
  2. 原表格关联两个匹配源
    将原表格分别与预处理后的Child表(匹配ChildPK)、Parent表(匹配ParentPK)做嵌套关联:

    SourceJoinChild = Table.NestedJoin(
        Source, 
        {"TargetNum"}, 
        ChildWithParentExpanded, 
        {"ChildPK"}, 
        "ChildMatch", 
        JoinKind.LeftOuter
    ),
    SourceJoinBoth = Table.NestedJoin(
        SourceJoinChild, 
        {"TargetNum"}, 
        ParentTable, 
        {"ParentPK"}, 
        "ParentMatch", 
        JoinKind.LeftOuter
    )
    
  3. 提取有效Parent数据
    添加自定义列,判断哪个关联结果非空,优先取Child匹配的Parent数据(若存在),否则取直接匹配Parent表的结果:

    AddParentData = Table.AddColumn(
        SourceJoinBoth, 
        "FinalParentData", 
        each if Table.IsEmpty([ChildMatch]) then [ParentMatch] else [ChildMatch]
    )
    
  4. 展开并清理表格
    展开FinalParentData列得到完整Parent数据,再删除中间关联列:

    ExpandedParent = Table.ExpandTableColumn(AddParentData, "FinalParentData", Table.ColumnNames(ParentTable), Table.ColumnNames(ParentTable)),
    CleanedTable = Table.RemoveColumns(ExpandedParent, {"ChildMatch", "ParentMatch"})
    

完整代码整合

let
    // 预处理ChildTable,关联Parent数据
    ChildWithParent = Table.NestedJoin(
        ChildTable, 
        {"ParentTableFK"}, 
        ParentTable, 
        {"ParentPK"}, 
        "ParentData", 
        JoinKind.LeftOuter
    ),
    ChildWithParentExpanded = Table.ExpandTableColumn(ChildWithParent, "ParentData", Table.ColumnNames(ParentTable), Table.ColumnNames(ParentTable)),

    // 原表格关联两个匹配源
    SourceJoinChild = Table.NestedJoin(
        Source, 
        {"TargetNum"}, 
        ChildWithParentExpanded, 
        {"ChildPK"}, 
        "ChildMatch", 
        JoinKind.LeftOuter
    ),
    SourceJoinBoth = Table.NestedJoin(
        SourceJoinChild, 
        {"TargetNum"}, 
        ParentTable, 
        {"ParentPK"}, 
        "ParentMatch", 
        JoinKind.LeftOuter
    ),

    // 提取有效Parent数据
    AddParentData = Table.AddColumn(
        SourceJoinBoth, 
        "FinalParentData", 
        each if Table.IsEmpty([ChildMatch]) then [ParentMatch] else [ChildMatch]
    ),

    // 展开并清理
    ExpandedParent = Table.ExpandTableColumn(AddParentData, "FinalParentData", Table.ColumnNames(ParentTable), Table.ColumnNames(ParentTable)),
    CleanedTable = Table.RemoveColumns(ExpandedParent, {"ChildMatch", "ParentMatch"})
in
    CleanedTable

效果验证

  • 当TargetNum匹配ChildPK时,ChildMatch非空,会提取其中的Parent数据
  • 当TargetNum匹配ParentPK时,ParentMatch非空,直接提取Parent表数据

内容的提问来源于stack exchange,提问作者user1795832

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 18:22:53