如何在Power BI查询编辑器中用M语言引用其他表?
在Power BI中用M语言引用其他表并实现数据对比
当然可以!M语言(Power Query)提供了多种方式来引用其他表、实现类似DAX中RELATED的关联逻辑,甚至能完成更灵活的数据对比需求,下面结合你的场景具体说明:
一、基础关联:合并查询(类似SQL JOIN)
如果只是需要像RELATED那样关联两张表并拉取字段,合并查询是最直接的方式,这相当于在数据加载阶段完成表关联:
- 在Power Query编辑器中打开TableA
- 点击「合并查询」→「合并查询作为新查询」
- 在弹出窗口中选择TableB,设置关联的匹配列(比如共同的ID列),选择合并类型(比如左外部)
- 合并后展开TableB的字段,就能在TableA中直接使用TableB的数据
对应的M语言代码示例(假设通过id列关联):
let Source = TableA, #"Merged Queries" = Table.NestedJoin(Source, {"id"}, TableB, {"id"}, "TableB", JoinKind.LeftOuter), #"Expanded TableB" = Table.ExpandTableColumn(#"Merged Queries", "TableB", {"keyword"}, {"keyword"}) in #"Expanded TableB"
二、实现类似SEARCH的文本匹配对比
你的DAX代码是检查main[text]中是否包含keywords[keyword]并返回匹配位置,在M语言中可以通过自定义列结合列表函数实现:
方法1:返回是否存在匹配(布尔值)
在TableA中添加自定义列,代码如下:
= List.AnyTrue(List.Transform(TableB[keyword], (kw) => Text.Contains([text], kw, Comparer.OrdinalIgnoreCase)))
这个代码会遍历TableB的所有关键词,检查当前行的text是否包含任意一个关键词,返回true或false。
方法2:返回第一个匹配的关键词位置(对齐DAX SEARCH的结果)
如果要返回匹配的起始位置,找不到则返回0,可以用:
= let keywordsList = TableB[keyword], matchResult = List.First(List.Select(List.Transform(keywordsList, (kw) => Text.PositionOf([text], kw, Occurrence.First)), (pos) => pos <> -1), -1) in if matchResult = -1 then 0 else matchResult + 1 // M的位置从0开始,DAX从1开始,这里加1对齐逻辑
三、M语言 vs DAX:适用场景区别
- DAX的
RELATED是在数据模型层面操作,适合报表可视化阶段的计算,依赖表之间的预设关系 - M语言的操作是在数据清洗/加载阶段完成,适合预处理数据,不需要依赖模型关系,更灵活支持复杂的文本、列表操作
内容的提问来源于stack exchange,提问作者Dennis Sheehan




