Microsoft Access - 合并具有相同字段的多个表

Posted

技术标签:

【中文标题】Microsoft Access - 合并具有相同字段的多个表【英文标题】:Microsoft Access - Merging Multiple Tables with Same Fields 【发布时间】:2021-03-06 14:02:25 【问题描述】:

我正在尝试弄清楚如何创建一个表来合并两个具有相同结构的表中的记录。每个表将具有以下字段:作为主键的 document_ID、documentNumber、documentRevision 和 documentTitle。这两个表的唯一区别是每个表都包含一个特定的“类型”文档。合并后的表最终应该包含两个表中的所有文档。

我尝试使用附加查询,但遇到了一个问题,即当记录插入每个表时,我无法弄清楚如何让查询运行。 在我的网上搜索中,我看到了一些关于“加入”的内容,但我没有运气了解如何使其发挥作用。

感谢任何帮助!

table1 : Documents of Type 1
+---------------+--------------------+-----------------+-------------------+
|  Document ID  |   Document Number  |   Document Rev  |  Document Title   |
+---------------+--------------------+-----------------+-------------------+
|      1        |      GCD_111       |         -       |     Title GCD1    |
|      2        |      GCD_222       |         A       |     Title GCD2    |
|      3        |      GCD_333       |         B       |     Title GCD3    |
+---------------+--------------------+-----------------+-------------------+

table2 : Documents of Type 2
+---------------+--------------------+-----------------+-------------------+
|  Document ID  |   Document Number  |   Document Rev  |  Document Title   |
+---------------+--------------------+-----------------+-------------------+
|      4        |      TSR_111       |         -       |     Title TSR1    |
|      5        |      TSR_222       |         A       |     Title TSR2    |
|      6        |      TSR_333       |         B       |     Title TSR3    |
+---------------+--------------------+-----------------+-------------------+

Result Table: Documents of Type 1 and Type 2
+---------------+--------------------+-----------------+-------------------+
|  Document ID  |   Document Number  |   Document Rev  |  Document Title   |
+---------------+--------------------+-----------------+-------------------+
|      1        |      GCD_111       |         -       |     Title GCD1    |
|      2        |      GCD_222       |         A       |     Title GCD2    |
|      3        |      GCD_333       |         B       |     Title GCD3    |
|      4        |      TSR_111       |         -       |     Title TSR1    |
|      5        |      TSR_222       |         A       |     Title TSR2    |
|      6        |      TSR_333       |         B       |     Title TSR3    |
+---------------+--------------------+-----------------+-------------------+

【问题讨论】:

How to ask a good SQL question。样本数据(你有什么)、预期结果(你想要什么)、你尝试过什么。 创建 > 查询设计 > SQL > select document_id, document_number ... from table1 UNION ALL document_id, document_number ... from table2 > 运行 您是在问如何将 table1 和 table2 中的所有记录附加到“结果表”?如果是,您不想要 JOIN。 JOIN 并不意味着物理连接表(它用于查询两个表相互重叠/相交的结果)。 感谢您的建议。 @zedfoxus,这是用于 Access 数据库,而不是 SQL 数据库。 是的@stifin,我只是想将两个表附加在一起。我尝试了追加查询,但不知道如何在将新记录添加到表 1 或表 2 时让它更新查询。 【参考方案1】:

您可以分解问题。首先,table1 和 table2 中的哪些记录尚未在结果表中?当您有执行此操作的查询时,将结果附加到结果表中。

我将对您的示例稍作修改,其中一条记录已在结果表中:

resulttable:
+-------------+-----------------+--------------+----------------+
| Document ID | Document Number | Document Rev | Document Title |
+-------------+-----------------+--------------+----------------+
|           1 | GCD_111         |            - | Title GCD1     |
+-------------+-----------------+--------------+----------------+

一、查询

INSERT INTO resulttable
SELECT a.[Document ID], a.[Document Number], a.[Document Rev], a.[Document Title]

FROM

(SELECT t1.[document id], t1.[Document Number], t1.[Document Rev], t1.[Document Title]
FROM table1 AS t1
LEFT JOIN resulttable AS rt on t1.[Document ID] = rt.[Document ID]
WHERE rt.[Document ID] IS NULL

UNION ALL

SELECT t1.[document id], t1.[Document Number], t1.[Document Rev], t1.[Document Title]
FROM table2 AS t1
LEFT JOIN resulttable as rt on t1.[Document ID] = rt.[Document ID]
WHERE rt.[Document ID] IS NULL) AS a

解释:table1 和 table2 中的记录尚未在结果表中?

首先,对 table1 执行此操作。以后我们可以对 table2 做同样的事情。

正如您所提到的,我们可以使用 JOIN。我在这里使用了 LEFT JOIN 来确定两个表在哪里 NOT 相交,即查看所有 table1 记录并告诉我哪些记录还没有在结果表中。如果您从 table1 和匹配的结果表记录中选择所有记录(与 [Document ID] 相交,您将更好地了解其工作原理:

select t1.*, rt.*
from table1 as t1
left join resulttable as rt on t1.[Document ID] = rt.[Document ID]

因为我们想要不匹配的部分,所以我们想要空位。因此,我们可以通过指定 WHERE 结果表记录为空并指定我们想要的列名来修改最后一个查询。这将使结果看起来完全符合我们希望他们寻找最终 INSERT 的方式。那就是:

select t1.[Document ID], t1.[Document Number], t1.[Document Rev], t1.[Document Title]
from table1 as t1
left join resulttable as rt on t1.[Document ID] = rt.[Document ID]
WHERE rt.[Document ID] IS NULL

接下来,UNION ALL 也会从 table2 中获取“新”结果。 (有关此 UNION ALL 的位置,请参阅最终查询。)

然后我将 SELECT.. UNION ALL SELECT.. 包裹在括号中,并给它起了别名“a”。这使我可以在括号内处理整个组,就好像它是一个名为“a”的表一样。

之后,剩下的就是一个普通的 INSERT 语句。

【讨论】:

以上是关于Microsoft Access - 合并具有相同字段的多个表的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 查询:合并特定字段列中具有相同数据的行

将文件导入microsoft access:字段映射

在不同的设置上使 SQL Server 中的 Microsoft Access 表相同

Microsoft Access 使用 Access 中的 SQL 查询合并两个 Excel 文件

Ms access 合并多重访问文件表

如何将 2 个以上的 Microsoft Access 表合并到一个表中?