Google 电子表格中的内部联接

INNER JOIN in Google Spreadsheets

我不知道或不记得我要查找的内容的技术名称,但我认为一个示例足以让您准确理解我要查找的内容。

给定 table A

a   x1
b   x2
c   x1

和TableB

x1  x
x1  y
x1  z
x2  p
x2  z

我需要TableC

a   x
a   y
a   z
b   p
b   z
c   x
c   y
c   z

我正在寻找一个或一组公式来获得 table C

我想只需要在 C table 上添加一个额外的行,其中包含 [=45= 上第一列的每个值] A 对于 TableA!Column2TableB!Column1[ 的每个对应值=36=] 但是我找不到如何

我认为这是一个简单的SQL内连接。

尝试:

=ARRAYFORMULA({TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$A2:A&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D}, 
 "select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦"))), IFNA(VLOOKUP(
 TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$B2:B&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D}, 
 "select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦")))&COUNTIFS(
 TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$A2:A&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D}, 
 "select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦"))), 
 TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$A2:A&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D}, 
 "select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦"))), ROW(INDIRECT("O1:O"&COUNTA(
 TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$B2:B&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D}, 
 "select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦")))))), "<="&ROW(INDIRECT("O1:O"&COUNTA(
 TRIM(FLATTEN(SPLIT(QUERY(REPT(IF($A2:A="",,$B2:B&"♦"), IFNA(VLOOKUP($B2:$B, QUERY({$D2:$D}, 
 "select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦"))))))), 
 {D2:D&COUNTIFS(D2:D, D2:D, ROW(O2:O), "<="&ROW(O2:O)), E2:E}, 2, 0))})

Las 答案不适用于 TableA!column1 上的重复项。 显示关键公式的说明:

只需添加一个中间列

JOIN(",",FILTER(E:E,D:D=L2))

所以你可以从他们那里获取数据

INDEX(TRANSPOSE(SPLIT(JOIN(",",FILTER(M:M,K:K=O2)),",")),COUNTIF(O:O1,"="&O2)+1) 

成多列

ArrayFormula(TRIM(FLATTEN(SPLIT(QUERY(REPT(IF(A2:A="",,A2:A&"♦"), IFNA(VLOOKUP(B2:B, QUERY({D2:D}, "select Col1,count(Col1) where Col1 is not null group by Col1"), 2, 0))),,9^9), "♦"))))

here is an example 和一张图片。

您尝试做的是 SQL 中的 JOIN,它会复制值。 Inner, left, right or full 定义了两边都没有匹配项时的行为。

我能想到的最简单的方法是使用 Google Apps Script 创建一个自定义函数以在公式中使用:

function JOINRANGES(range1, index1, range2, index2) {
 const result = []
 for(let row1 of range1) {
   for (let row2 of range2) {
     if (row1[index1] == row2[index2]) {
       const r = [...row1, ...row2]
       // Remove the keys themselves
       r.splice(row1.length+index2, 1)
       r.splice(index1, 1)
       result.push(r)
     }
   }
 }
 return result
}

然后您可以在左上列的工作表公式中使用它:

=ARRAYFORMULA(JOINRANGES(A1:B3, 1, D1:E6, 0))

第一个和第三个参数是范围,第二个和第四个参数是范围内列的索引(从0开始)。

最终结果:

如果您不了解 Google Apps 脚本,the about page in the google-apps-script tag 有很多非常有用的指南和文档。