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

rum*_*cho 37 worksheet-function microsoft-excel

假设我在 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
Run Code Online (Sandbox Code Playgroud)

第 2 页:

Shelley        Percy Bysshe
Eichendorff    Josef Freiherr Von
Flaubert       Gustave
Byron          Lord
Keller         Gottfried
Dostoyevski    Fyodor
Zola           Emile
Balzac         Honoré de
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

致所有被这种情况吓坏的人:我知道这是错误的做法。如果我有什么选择,我会不会使用Excel这一点。但是,有足够多的情况需要实用的解决方案,但无法应用更好的(从 IT 角度来看)解决方案。

end*_*and 46

简单的方法 - 标准的 Excel 操作

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

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

然后,添加两列(在本例中),每个表中的每个数据列对应一列。我建议您也使用格式作为表格选项,因为它使您的公式看起来更好。使用 vlookup,使用以下公式:

=IFERROR(VLOOKUP([@ID],Sheet4!A:B,2,FALSE),"")
Run Code Online (Sandbox Code Playgroud)

哪里Sheet4!A:B代表每个相应值的源表数据表。IFERROR 可防止在 vlookup 不成功时出现的丑陋 #N/A 结果,在这种情况下返回一个空白单元格。

这为您提供了结果表。


表 3:

在此处输入图片说明

表 4:

在此处输入图片说明

结果数据:

在此处输入图片说明

结果公式(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.xlsx. countries$ countries$左外连接C:\Users\Username\Desktop\Book2.xlsxnames$ names$ON countries$.ID = names$.ID} WHERE(names$.ID 为空)

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

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

不适合胆小的人。但是,如果您想有机会看到 Office 中一些尚未更新但可能还活着的部分,那么这是一个很好的机会。


Kyl*_*ale 18

作为替代解决方案,我可以建议Power Query吗?它是来自 Microsoft 的免费 Excel 插件,用于基本上执行此类操作。它的功能实际上也将直接包含在 Excel 2016 中,因此它是面向未来的。

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

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

这样做的好处是一旦你设置了它,如果你对你的基本数据表进行了更改,你只需点击数据 > 全部刷新,你的 Power Query 结果表也会更新。