MS Access-插入所有数据的Upsert查询(包括重复项)

时间:2019-06-07 09:11:41

标签: sql ms-access

对您来说可能是一个简单的操作,但是我显然缺少一些东西(到目前为止缺少睡眠和咖啡)基本上,我有一个基于多个文件的批量导入过程,用于将事件数据导入到我们的数据库中。同样的数据可能出现在多个电子表格中,因此我将它们全部导入到临时表中,并试图使用upsert插入新的/更新的重复项。

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

数据的工作方式:

插入Excel工作表的表格用于活动参与者。为了确定“与会者”是否唯一,我们检查了3个条件,

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

EventID =他们正在参加什么活动

TypeID =他们的与会者类型(赞助人,代表,发言人等)

我对另一个导入过程有另一个upsert查询,但是该查询仅检查1个字段并且可以正常工作,但是由于正在检查3个字段,并且由于某种原因无法正常工作。

以下数据仅是示例,字段'EventID','ContactID'和'TypeID'均为外键

Upsert之前的样本数据:

+-----------+---------+-----------+--------+---------+
| 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];

1 个答案:

答案 0 :(得分:0)

您可以通过检查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在不可用的追加查询中对数据进行重复数据删除。