对您来说可能是一个简单的操作,但是我显然缺少一些东西(到目前为止缺少睡眠和咖啡)基本上,我有一个基于多个文件的批量导入过程,用于将事件数据导入到我们的数据库中。同样的数据可能出现在多个电子表格中,因此我将它们全部导入到临时表中,并试图使用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];
答案 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
在不可用的追加查询中对数据进行重复数据删除。