PowerQuery条件NestedJoin:如何统一获取ParentTable数据?
PowerQuery 统一获取关联ParentTable数据解决方案
核心思路
先把ChildTable与ParentTable预关联,让每个Child记录携带对应的Parent数据;再将原表格分别与预处理后的Child表、Parent表进行关联;最后通过判断关联结果是否为空,统一提取有效Parent数据并展开。
分步实现(含代码示例)
假设:
- 原表格名为
Source,目标数字列名为TargetNum - ParentTable主键列名为
ParentPK,需获取的Parent数据列是ParentTable的所有列 - ChildTable主键列名为
ChildPK,关联Parent的外键列名为ParentTableFK
预处理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))原表格关联两个匹配源
将原表格分别与预处理后的Child表(匹配ChildPK)、Parent表(匹配ParentPK)做嵌套关联:SourceJoinChild = Table.NestedJoin( Source, {"TargetNum"}, ChildWithParentExpanded, {"ChildPK"}, "ChildMatch", JoinKind.LeftOuter ), SourceJoinBoth = Table.NestedJoin( SourceJoinChild, {"TargetNum"}, ParentTable, {"ParentPK"}, "ParentMatch", JoinKind.LeftOuter )提取有效Parent数据
添加自定义列,判断哪个关联结果非空,优先取Child匹配的Parent数据(若存在),否则取直接匹配Parent表的结果:AddParentData = Table.AddColumn( SourceJoinBoth, "FinalParentData", each if Table.IsEmpty([ChildMatch]) then [ParentMatch] else [ChildMatch] )展开并清理表格
展开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
相关产品推荐
相关产品推荐

