如何进行全外连接?

Posted

技术标签:

【中文标题】如何进行全外连接?【英文标题】:How to do a full outer join? 【发布时间】:2022-01-23 03:02:29 【问题描述】:

我正在尝试在两个不同的工作表中对以下数据进行完全连接。

第 9 页:

Product ID Name Quantity
1 addi 55
2 fadi 66
3 sadi 33

Sheet10

Product ID Variants Model
1 xyz 2000
2 differ 2001
3 saddd 336
4 fsdfe 2005

所需的输出表:

Product ID Name Quantity Variants Model
1 addi 55 xyz 2000
2 fadi 66 differ 2001
3 sadi 33 saddd 336
4 fsdfe 2005

如果我们有更多列要加入,如表 1 和表 2 中还有两列,如年份、产品标签等,请分享,那么我应该在您提出的解决方案中进行哪些更改

我正在使用这个公式,但它没有返回所需的结果

=ARRAYFORMULA(QUERY(SORT(UNIQUE(Sheet9!A1:D; Sheet10!A1:D)), "where Col1 is not null"),IFERROR(VLOOKUP(TRANSPOSE(QUERY(TRANSPOSE(QUERY(SORT(UNIQUE(Sheet9!A1:D; Sheet10!A1:D)), "where Col1 is not null")),,999^99)), TRANSPOSE(QUERY(TRANSPOSE(Sheet9!A1:D),,999^99)), Sheet9!C1:C, 2, 0),""),IFERROR(VLOOKUP(TRANSPOSE(QUERY(TRANSPOSE(QUERY(SORT(UNIQUE(Sheet9!A1:D; Sheet10!A1:D)), "where Col1 is not null")),,999^99)), TRANSPOSE(QUERY(TRANSPOSE(Sheet10!A1:D),,999^99)), Sheet10!C1:C, 2, 0),""))

【问题讨论】:

请在您的帖子中包含您已经完成的具体研究以及您自己已经尝试实现目标的公式,请记住,志愿者运行的免费论坛旨在提供对已经自己完成大部分工作的人知之甚少或“朝正确方向轻推”(也就是说,论坛不是一个任何人都可以免费获得由专家完成的定制化、耗时的工作的地方)。 【参考方案1】:

编辑考虑动态行匹配。

See this spreadsheet 进行说明,但总体而言,您的设置存在问题,但我会将您的问题分为两个步骤。

获取不同的 ID 列表

你可以用这个公式得到:

=unique(transpose(split(textjoin(",",true,
    iferror(INdex(Sheet2!$A$2:$Z,0,MATCH(A1,Sheet2!1:1,0)),""),
    iferror(INdex(Sheet1!$A$2:$Z,0,MATCH(A1,Sheet1!1:1,0)),"")),",")))

标题的其余部分

那么对于每个标题,它们总是只在 1 中还是在 2 中(而不是两者)?假设是这样,这应该适用于每个附加列。如果两个工作表中存在两个值,则将它们连接到同一列中。

=filter( 
 iferror(VLOOKUP($A$2:$A,Sheet1!$A:$Z,match(E$1,Sheet1!1:1,0),false),"")
 &iferror(VLOOKUP($A$2:$A,Sheet2!$A:$Z,match(E$1,Sheet2!1:1,0),false),"")
   ,$A$2:$A<>"")

可能有一种方法可以更优雅地使用 join 函数(如果有人发布答案显示我会投票)。

【讨论】:

法瓦德,我看了你的公式。它真的没有“一个小错误”。我自己只取出了第一部分,它产生的结果无法在工作解决方案的任何部分中使用。如果第一部分错了,它只会在你试图添加更多内容时走下坡路。再一次,我们不是要不友善,只是现实。你要求人们为你做免费的高级工作。你会去一家提供免费一英寸糕点样品的面包店,并期望他们免费为你举办派对(即使你尝试制作甜点但失败了)? (续)即使如果你的公式只有“一个小错误”(它没有),它仍然需要专家和相当多的时间投入逐个分析公式,测试组件并发现这样的错误——通常比从头开始编写新公式还要长。在您的情况下,任何一种情况都将构成我们将向任何其他客户收取费用的实际工作。将论坛视为提供一英寸样品的面包店,而不是免费举办派对的场所(即使对于那些非常努力地尝试自己制作甜点但失败的人也是如此)。 感谢@ErikTyler。我觉得我最近对这些事情变得更加不耐烦了。祝法瓦德好运,感谢您的接受。

以上是关于如何进行全外连接?的主要内容,如果未能解决你的问题,请参考以下文章

数据库的内连接外连接(左外连接右外连接全外连接)以及交叉连接(转)

左外连接,右外连接,全外连接

如何在 Spark Scala 高效的全外连接中合并连接多个 DataFrame

Mysql全外连接两个子查询

数据库外连接及MySQL实现

SQLite 3.39.0 发布,支持右外连接和全外连接