如何在Excel中模拟完全外部联接?


34

假设我有一些Excel中的数据(而不是真实数据库中的数据)。在一张纸上,我有数据,其中一列用作ID,并且确保该列中的值是唯一的。在另一张纸上,我也有一些数据,同样有一个列可以当作ID使用,它也是唯一的。如果工作表1中的N行具有某些值,并且工作表2中的M行具有相同的值,那么我可以确定N行和M行描述的是同一真实世界对象。

我要问的是:如何在不编写任何宏的情况下获得完全外部联接的等效功能?可以通过功能区访问的公式和所有函数都可以。

一个小的“播放数据”示例:

表格1:

Dostoyevski    Russia
Pushkin        Russia
Shelley        England
Flaubert       France
Hugo           France
Eichendorff    Germany
Byron          England
Zola           France

工作表2:

Shelley        Percy Bysshe
Eichendorff    Josef Freiherr Von
Flaubert       Gustave
Byron          Lord
Keller         Gottfried
Dostoyevski    Fyodor
Zola           Emile
Balzac         Honoré de

所需的输出(排序并不重要):

Dostoyevski    Russia   Fyodor
Pushkin        Russia
Shelley        England  Percy Bysshe
Flaubert       France   Gustave
Hugo           France
Eichendorff    Germany  Josef Freiherr von
Byron          England  Lord
Zola           France   Emile
Keller                  Gottfried
Balzac                  Honoré de

对于每个对此场景感到恐惧的人:我知道这是错误的方法。如果有任何选择,我将不会使用Excel。但是,有足够的情况需要实用的解决方案,统计信息,并且无法应用更好的(从IT角度来看)解决方案。


如果您对两个列表进行排序并排放置,则手动匹配所需的列应该相当容易。如果您有大量数据,则可以编写一个具有两个范围的函数,并为您完成此操作。
丹丹

就像我说的@Dan一样,我要求不编写函数就这样做。在我可以写的情况下,解决方案很简单(至少对我来说,因为我之前写过VBA)
rumtscho

Excel通过数据连接支持SQL查询。我对此感到很糟糕,因此很遗憾,我无法提供更多建议,但值得您寻找。
凯尔(Kyle)

@Kyle我将该选项添加到了我的答案中。这不是为了胆小的人,因为这可能玩得一团糟和/或完全太残忍了,但是,为什么不呢!
enderland'1

Answers:


43

简单方法-标准Excel操作

首先,将两个表中的两个关键列都复制/粘贴到一个新的工作表中,作为一个单独的列。

使用“删除重复项”获取所有唯一键的单个列表。

然后,添加两列(在这种情况下),每个表中的每个数据列一个。我建议您也使用“格式为表格”选项,因为它会使您的公式看起来更好。使用vlookup,使用以下公式:

=IFERROR(VLOOKUP([@ID],Sheet4!A:B,2,FALSE),"")

其中,Sheet4!A:B代表每个相应值的源表数据表是什么。IFERROR可以防止在vlookup不成功时出现难看的#N / A结果,在这种情况下,该结果将返回一个空白单元格。

这将为您提供结果表。


工作表3:

在此处输入图片说明

Sheet4:

在此处输入图片说明

结果数据:

在此处输入图片说明

结果公式(Ctrl+ ~将切换此公式):

在此处输入图片说明


内置SQL查询

您也可以使用内置的SQL查询来执行此操作。它...不那么用户友好,但也许将是一个更好的用例。这可能需要您将“源”数据格式化为表格。

  1. 单击新工作表中的单元格
  2. 转到数据->从其他来源->从Microsoft Query
  3. 在“数据库”选项卡下选择“ Excel文件” *,然后单击“确定”。
  4. 选择您的工作簿
  5. 选择以下四个字段:
    • 在此处输入图片说明
  6. 在出现的漂亮的1990年代警告中,单击“下一步”和“确定”
  7. 按照这些说明创建第一个左外部联接。就我而言,我使用“国家”表作为左侧来源,使用“名称”作为右侧。
    • 在此处输入图片说明
    • 这仅给出了一些行(因为您加入了ID)
  8. “创建减法联接然后将其添加为联合”部分更加复杂。

    • 这是减法联接配置: 在此处输入图片说明
    • 从SQL按钮复制此联接的SQL:
    • 选择countries$.ID,countries$.Val1,names$.ID 、names$. Val2 来自{oj C:\Users\Username\Desktop\Book2.xlsxcountries$ countries$左外联接C:\Users\Username\Desktop\Book2.xlsxnames$ names$ON countries$.ID = names$.ID}在哪里(names$.ID为空)

  9. 返回到您创建的第一个外部联接。手动编辑SQL和

    • 添加Union到底部
    • 将以上减去连接文本添加到连接的底部
  10. 点击SQL按钮左侧的“返回数据”按钮
    • 您可能需要编辑SQL以仅选择此时所需的特定数据。我发现在结果中隐藏列更容易。
  11. 将查询放在某处并确认其位置
    • 在此处输入图片说明

不是为了胆小的人。但是,如果您希望有很大的机会看到Office的某些未更新的版本,那将是一个很大的机会。


1
您有[@ID]表示法的参考吗?我毫不怀疑它是否有效,但是我从未见过,并且我在Excel中做了很多工作。
TJL

1
@TJL如果将表格格式化为表格,它将使用这种表示法来引用其他列。比单元格引用要清晰得多。这可能是2010年以后的功能吗?我不确定。我没有给2010使用魔法格式如表足够的前..
enderland


您是否不能仅将原始查询中的单词LEFT更改为单词FULL?我确定它只是使用ACE OLEDB驱动程序来运行该查询,该驱动程序支持FULL JOIN语法。
凯尔·黑尔

14

作为替代解决方案,我可以建议使用Power Query吗?它是Microsoft的免费Excel加载项,用于基本上执行此类操作。实际上,它的功能也将直接包含在Excel 2016中,因此它已过时。

无论如何,使用Power Query,步骤非常简单:

  1. 将两个表都作为查询导入到Power Query Editor中。
  2. 对它们执行“合并查询”转换,设置适当的联接列,并将联接类型设置为“完全外部”。
  3. 将结果表加载到新表中。

这样做的好处是,一旦完成设置,如果您对基本数据表进行更改,则只需单击数据>全部刷新,并且Power Query结果表也将更新。


非常有意思。我的一个拥有餐厅的朋友正在问我有关MS Office的问题,并向我展示了他的2016年套房,其中不包括MS Access。我现在知道为什么。Excel有很多限制。我从未购买过2003年以上的产品,因为这些功能都不值钱,而且我也不喜欢新外观。2010年及以上。Access会做所有这些以及更多的事情,这引出了一个问题,为什么当Access是实现此目的的方式时,为什么有那么多人试图在Excel中执行数据库工作?我唯一看到的是,也许要使一个好的Access DB正常工作,它还需要良好的VB经验。
ejbytes

@ejbytes大多数人都了解电子表格的概念。大多数人不了解数据库的概念。我有一个将电子表格即数据库项目转换为数据库的项目,即使对数据库的工作原理进行了详尽的解释,用户仍然称其为“电子表格”!
enderland

@enderland我认为你是对的。具有不严格的规则和不连续的灵活性的电子表格...以及伪装成过滤器的查询。临时表格和列表的平台。
ejbytes

@ejbytes tldr版本是MS想要在Excel中测试列存储内存引擎以允许更多行,它包含外部数据连接,事实证明它非常流行,因此将它们添加到ETL工具中。现在他们将所有工具汇总为PowerBI。
凯尔·黑尔

@KyleHale我正在使用Office 2010并尝试执行FULL OUTER JOIN,但Power Query会忽略第二个表中的ID(不在第一个表中)。
GeMir '16

0

半模拟(外部联接)的一种快速方法是获取第二个列表并将其直接粘贴在拳头列表的下面,即,这样(主键)都在同一(主)列中。然后对该主列进行排序,最后得到一个交错的列表,然后执行转置的IF方程(超级用户正在弄乱表布局视图。):

listA listB


sam blue tim 32874 tim red mary 5710 chris green gustav 047 fred蓝
玛丽黑色

复制/粘贴/排序,结果看起来像这样:AB克里斯·格林弗雷德·蓝·古斯塔夫047玛丽5710玛丽·黑·萨姆·蓝蒂姆32874蒂姆·红

然后计算单元格c1的公式:(c1)= if(A1 = A2,B2)

结果看起来像这样:

ABC克里斯绿色假弗雷德蓝色假古斯塔夫047假玛丽5710黑色玛丽黑色假萨姆蓝色假蒂姆32874红色蒂姆红假

对C进行排序以消除错误等。这是该想法的基本版本,如果需要更多数据,请对其进行扩展。-wag770310


您能以任何方式格式化它以使其可读吗?
davidbaumann
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.