假设我们有两个PowerQuery查询:
Query1
且具有列Col1_1
和Col1_2
的查询Query2
且具有列Col2_1
和Col2_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
答案 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