Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google sheets google sheets查询左连接一对多_Google Sheets_Google Query Language - Fatal编程技术网

Google sheets google sheets查询左连接一对多

Google sheets google sheets查询左连接一对多,google-sheets,google-query-language,Google Sheets,Google Query Language,我有两个表,我正在尝试使用google查询语言或任何可以输出结果集的公式执行左连接 表1 表2 结果集 我怎样才能做到这一点 关于在B2中使用: =ARRAYFORMULA(IFNA(VLOOKUP(Table1!A2:A, {Table2!B:B, Table2!A:A}, 2, 0))) 在B2中使用: =ARRAYFORMULA(IFNA(VLOOKUP(Table1!A2:A, {Table2!B:B, Table2!A:A}, 2, 0))) 好的,首先是一个内部连接: =Arra

我有两个表,我正在尝试使用google查询语言或任何可以输出结果集的公式执行左连接

表1

表2

结果集

我怎样才能做到这一点

关于在B2中使用:

=ARRAYFORMULA(IFNA(VLOOKUP(Table1!A2:A, {Table2!B:B, Table2!A:A}, 2, 0)))
在B2中使用:

=ARRAYFORMULA(IFNA(VLOOKUP(Table1!A2:A, {Table2!B:B, Table2!A:A}, 2, 0)))
好的,首先是一个内部连接:

=ArrayFormula(query(iferror(split(flatten(if(transpose(filter(Table2!B2:B,Table2!B2:B<>""))=filter(Table1!A2:A,Table1!A2:A<>""),filter(Table1!A2:A,Table1!A2:A<>"")&"|"&transpose(filter(Table2!A2:A,Table2!A2:A<>"")),)),"|")),"select Col1,Col2 where Col1 is not null label Col1 '',Col2 ''"))
它构建一个二维数组并填充两组数据匹配的位置,然后将其展平为1D数组并将其拆分为两列

我认为您只需添加不匹配的行即可获得左外部联接:

=ArrayFormula({query(iferror(split(flatten(if(transpose(filter(Table2!B2:B,Table2!B2:B<>""))=filter(Table1!A2:A,Table1!A2:A<>""),
filter(Table1!A2:A,Table1!A2:A<>"")&"|"&transpose(filter(Table2!A2:A,Table2!A2:A<>"")),)),"|")),"select Col1,Col2 where Col1 is not null label Col1 '',Col2 ''");
filter(Table1!A2:B,isna(vlookup(Table1!A2:A,Table2!B2:B,1,false)))})

这是一种特殊情况,其中第一个表仅由键ID组成,对于ID匹配的行,您只需要第二个表中的键加上另一列。添加更多由管道符号或任何其他选择的字符分隔的列是很简单的,但这些列必须是硬编码的:我不知道这种方法是否能自动包含两个表中的所有列

这与答案相反,答案会自动合并两个表中的列,但不允许一对多关系。

好的,首先是一个内部联接:

=ArrayFormula(query(iferror(split(flatten(if(transpose(filter(Table2!B2:B,Table2!B2:B<>""))=filter(Table1!A2:A,Table1!A2:A<>""),filter(Table1!A2:A,Table1!A2:A<>"")&"|"&transpose(filter(Table2!A2:A,Table2!A2:A<>"")),)),"|")),"select Col1,Col2 where Col1 is not null label Col1 '',Col2 ''"))
它构建一个二维数组并填充两组数据匹配的位置,然后将其展平为1D数组并将其拆分为两列

我认为您只需添加不匹配的行即可获得左外部联接:

=ArrayFormula({query(iferror(split(flatten(if(transpose(filter(Table2!B2:B,Table2!B2:B<>""))=filter(Table1!A2:A,Table1!A2:A<>""),
filter(Table1!A2:A,Table1!A2:A<>"")&"|"&transpose(filter(Table2!A2:A,Table2!A2:A<>"")),)),"|")),"select Col1,Col2 where Col1 is not null label Col1 '',Col2 ''");
filter(Table1!A2:B,isna(vlookup(Table1!A2:A,Table2!B2:B,1,false)))})

这是一种特殊情况,其中第一个表仅由键ID组成,对于ID匹配的行,您只需要第二个表中的键加上另一列。添加更多由管道符号或任何其他选择的字符分隔的列是很简单的,但这些列必须是硬编码的:我不知道这种方法是否能自动包含两个表中的所有列


这与答案相反,答案会自动组合两个表中的列,但不允许一对多关系。

我还看到许多解决方案使用VLOOKUP、索引、匹配等复杂公式

我决定编写一个用户函数来合并表,或者正如我所说的,对数据库进行反规范化。我编写了反规范化函数来支持内部联接、左联接、右联接和完全联接。通过嵌套函数调用,理论上可以连接无限的表

DENORMALIZE(range1, range2, primaryKey, foreignKey, [joinType])
参数:

range1,作为命名范围、符号或数组的主表 range2,作为命名范围、符号或数组的相关表 primaryKey是主表的唯一标识符,列以1开头 foreignKey,要连接到主表的相关表中的键,列以1开头 joinType,联接类型,内部,左侧,右侧,完全,可选,默认为内部,不区分大小写 返回:结果为二维数组

结果集示例:

=QUERY(denormalize("Employees","Orders",1,3), "SELECT * WHERE Col2 = 'Davolio' AND Col8=2", FALSE)
埃皮德 姓氏 名字 订单编号 客户编号 埃皮德 訂單日期 希佩里德 1. 达沃利奥 南希 10285 63 1. 8/20/1996 2. 1. 达沃利奥 南希 10292 81 1. 8/28/1996 2. 1. 达沃利奥 南希 10304 80 1. 9/12/1996 2.
我还见过许多使用VLOOKUP、INDEX、MATCH等复杂公式的解决方案

我决定编写一个用户函数来合并表,或者正如我所说的,对数据库进行反规范化。我编写了反规范化函数来支持内部联接、左联接、右联接和完全联接。通过嵌套函数调用,理论上可以连接无限的表

DENORMALIZE(range1, range2, primaryKey, foreignKey, [joinType])
参数:

range1,作为命名范围、符号或数组的主表 range2,作为命名范围、符号或数组的相关表 primaryKey是主表的唯一标识符,列以1开头 foreignKey,要连接到主表的相关表中的键,列以1开头 joinType,联接类型,内部,左侧,右侧,完全,可选,默认为内部,不区分大小写 返回:结果为二维数组

结果集示例:

=QUERY(denormalize("Employees","Orders",1,3), "SELECT * WHERE Col2 = 'Davolio' AND Col8=2", FALSE)
埃皮德 姓氏 名字 订单编号 客户编号 埃皮德 訂單日期 希佩里德 1. 达沃利奥 南希 10285 63 1. 8/20/1996 2. 1. 达沃利奥 南希 10292 81 1. 8/28/1996 2. 1. 达沃利奥 南希 10304 80 1. 9/12/1996 2.
嗨,汤姆,这是一个很棒的解决方案。我自己拿不到。谢谢!谢谢我将在前面的解决方案中添加一个注释,以说明这是一种处理一对多关系的可能方法。嗨,汤姆,这是一个很棒的解决方案。我自己拿不到。谢谢!谢谢我将在以前的解决方案中添加一个注释,以说明这是处理一对多关系的一种可能方法。我已随意编辑了问题的标题,以表明它要求两个表之间存在一对多关系,因为ID=3在第二个表中出现两次,并且您需要两行。我随意编辑问题的标题以表明它要求两个表之间的一对多关系,因为ID=3在第二个表中出现两次,并且您需要两行。