如何在PowerQuery中将两个表与多个匹配的列之一进行联接?

时间:2019-02-12 16:03:39

标签: excel powerquery m

假设我们有两个PowerQuery查询:

  1. 名为Query1且具有列Col1_1Col1_2的查询
  2. 名为Query2且具有列Col2_1Col2_2的查询

我知道可以将两个查询与这样的合并查询合并:

let
    Source = Table.NestedJoin(Query1,{"Col1_1", "Col1_2"},Query2,{"Col2_1", "Col2_2"},"Query2",JoinKind.LeftOuter)
in
    Source

在SQL中,可以表示为

SELECT
    *
FROM
    Query1
    LEFT JOIN Query2 ON Query1.Col1_1 = Query2.Col2_1 AND Query1.Col1_2 = Query2.Col2_2

问题:如果两列中至少有一个匹配,是否可以将两个查询合并? 在SQL中,可以表示为

SELECT
    *
FROM
    Query1
    LEFT JOIN Query2 ON Query1.Col1_1 = Query2.Col2_1 OR Query1.Col1_2 = Query2.Col2_2

2 个答案:

答案 0 :(得分:1)

据我所知,没有任何选项可以更改PQ的Join函数中的默认匹配方法。但是,您可以在所需的每个列上执行两个联接,然后合并这些联接的结果。

当col1和col2都匹配时,这将导致重复的匹配,我不确定这是否是预期的结果。如果没有,则可以使用PQ设置索引来捕获这些重复项并将其删除。

假设Query2还添加了一个看起来像这样的索引:

let
    Source = Query1,
    #"Added Index" = Table.AddIndexColumn(Source, "Index", 0, 1),
    #"Merged Queries" = Table.NestedJoin(#"Added Index",{"col1"},Query2,{"col1"},"col1Join",JoinKind.LeftOuter),
    #"Merged Queries1" = Table.NestedJoin(#"Merged Queries",{"col2"},Query2,{"col2"},"col2Join",JoinKind.LeftOuter),
    #"Added Custom" = Table.AddColumn(#"Merged Queries1", "MergeTables", each Table.Combine({[col1Join],[col2Join]})),
    #"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "MergeTables", {"col1", "col2", "Index"}, {"Query2.col1", "Query2.col2", "Query2.Index"}),
    #"Removed Duplicates" = Table.Distinct(#"Expanded Custom", {"Index", "Query2.Index"}),
    #"Removed Columns" = Table.RemoveColumns(#"Removed Duplicates",{"Index", "col1Join", "col2Join", "Query2.Index"})
in
    #"Removed Columns"

这不是一个非常可扩展的解决方案,但是我认为它可以正常工作吗?

答案 1 :(得分:0)

除了进行表联接外,另一种可能性是使用所需的逻辑添加自定义列:

Table.AddColumn(Source, "JoinQuery2",
    (Q1) => Table.SelectRows(Query2,
                each Q1[Col1_1] = [Col2_1] or Q1[Col1_2] = [Col2_2]
            )
)

然后您可以展开表的此列,就像进行合并一样。


我从这篇博客文章中得到了这个主意: Join Conditions In Power Query, Part 1