首页 > 解决方案 > MS Access - Upsert 查询插入所有数据(包括重复)

问题描述

对您来说可能是一个简单的过程,但是我显然遗漏了一些东西(到目前为止缺乏睡眠和咖啡) 基本上我有一个基于多个文件的大规模导入过程,以将事件数据导入我们的数据库。事情是相同的数据可能出现在多个电子表格中,所以我将它们全部导入临时表并尝试使用 upsert 插入新的/更新重复项。

但是......它基本上只是插入所有数据,即使它是“重复的”

数据如何运作:

正在插入 Excel 工作表的表格是供活动参与者使用的。为了确定“参加者”是否唯一,我们检查 3 个标准,

ContactID = 它们是否存在于主数据中(这是 FK - 如果它们不存在于联系人表中,则无法添加为与会者)

EventID = 他们参加什么活动

TypeID = 他们是什么与会者类型(赞助商、代表、演讲者等...)

我对另一个导入过程有另一个 upsert 查询,但是它只检查 1 个字段并且工作正常,但是因为这是检查 3 并且由于某种原因没有按预期工作。

以下数据只是一个示例,“EventID”、“ContactID”和“TypeID”字段都是外键

更新插入前的样本数据:

+-----------+---------+-----------+--------+---------+
| StagingID | EventID | ContactID | TypeID | IsDupe? |
+-----------+---------+-----------+--------+---------+
|         1 |       1 |         1 |      1 | No      |
|         2 |       1 |         2 |      1 | No      |
|         3 |       1 |         3 |      2 | No      |
|         4 |       1 |         2 |      1 | Yes     |
|         5 |       2 |         1 |      3 | No      |
|         6 |       2 |         2 |      2 | No      |
|         7 |       2 |         2 |      1 | No      |
|         8 |       2 |         3 |      1 | No      |
|         9 |       3 |         1 |      1 | No      |
|        10 |       3 |         2 |      1 | No      |
|        11 |       3 |         3 |      2 | No      |
|        12 |       3 |         3 |      3 | No      |
|        13 |       3 |         4 |      1 | No      |
|        14 |       3 |         2 |      1 | Yes     |
|        15 |       2 |         3 |      1 | Yes     |
+-----------+---------+-----------+--------+---------+

预期结果:( 实际结果只是上表中的所有数据)

+------------+---------+-----------+--------+---------+
| AttendeeID | EventID | ContactID | TypeID | IsDupe? |
+------------+---------+-----------+--------+---------+
|          1 |       1 |         1 |      1 | No      |
|          2 |       1 |         2 |      1 | No      |
|          3 |       1 |         3 |      2 | No      |
|          4 |       2 |         1 |      3 | No      |
|          5 |       2 |         2 |      2 | No      |
|          6 |       2 |         2 |      1 | No      |
|          7 |       2 |         3 |      1 | No      |
|          8 |       3 |         1 |      1 | No      |
|          9 |       3 |         2 |      1 | No      |
|         10 |       3 |         3 |      2 | No      |
|         11 |       3 |         3 |      3 | No      |
|         12 |       3 |         4 |      1 | No      |
+------------+---------+-----------+--------+---------+

基本上,第一张桌子上“是”的任何人都是“重复的”,因为他们是同一个人以相同的出席类型参加同一活动。 注意:表中的“重复”不是一个字段,只是这个问题的关键

UPDATE Out_Data LEFT JOIN In_Data ON (Out_Data.TypeID = In_Data.TypeID) AND (Out_Data.ContactID = In_Data.ContactID) AND (Out_Data.EventID = In_Data.EventID) SET In_Data.EventID = [Out_Data]![EventID], In_Data.ContactID = [Out_Data]![ContactID], In_Data.TypeID = [Out_Data]![TypeID], In_Data.Entry = [Out_Data]![Entry];

另外:这是我所做的一个 Upsert 查询,它确实按预期进行:

UPDATE tbl_Contacts RIGHT JOIN tbl_STG_Suppression ON tbl_Contacts.Email = tbl_STG_Suppression.Email SET tbl_Contacts.Suppress = -1, tbl_Contacts.Email = [tbl_STG_Suppression]![Email];

标签: sqlms-access

解决方案


您可以通过检查 ID 是第一个具有要检查重复项的指定值的 ID 来过滤掉重复项

UPDATE Out_Data 
LEFT JOIN In_Data ON (Out_Data.TypeID = In_Data.TypeID) AND (Out_Data.ContactID = In_Data.ContactID) AND (Out_Data.EventID = In_Data.EventID) 
SET In_Data.EventID = [Out_Data]![EventID], In_Data.ContactID = [Out_Data]![ContactID], In_Data.TypeID = [Out_Data]![TypeID], In_Data.Entry = [Out_Data]![Entry]
WHERE Out_Data.AttendeeID = 
(SELECT Min(s.AttendeeID)
FROM Out_Data s
WHERE s.EventID = Out_Data.EventID AND s.ContactId = Out_data.ContactID AND Out_Data.TypeID = s.TypeID)

请注意,首先删除重复数据然后再插入数据可能会提高性能。如果这样做,您可以SELECT DISTINCT在不可用的 upsert 查询中使用重复数据删除。


推荐阅读