sql - 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];
解决方案
您可以通过检查 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 查询中使用重复数据删除。
推荐阅读
- mapbox-gl - 矢量平铺路线查找
- javascript - 处理 Promise 中的错误
- php - 为什么我无法从 WP_REST_Request 访问查询参数?
- javascript - 使用嵌套的 then 语句传递值
- qt - Qt OPC-UA - 访问趋势/历史数据
- php - 在新的 Chrome v69 中输入“图像”不会加载表单值。空帖子
- monitoring - 如何监控 Nagios?
- android - Android 意图将活动置于首位或创建一个必要的案例
- shell - diff -u -s,行数(+,-)没有给出正确的值
- javascript - 始终显示 ChartJS 自定义工具提示