MS Access - Upsert Query, вставляющий все данные (включая дубликаты) - PullRequest
0 голосов
/ 07 июня 2019

Вероятно, это просто для вас, но я явно что-то упускаю (пока не хватает сна и кофе). В основном, у меня есть процесс массового импорта, основанный на нескольких файлах, для импорта данных событий в нашу базу данных.Дело в том, что одни и те же данные могут появляться в нескольких электронных таблицах, поэтому я импортирую их все в промежуточную таблицу и пытался использовать 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      |
+------------+---------+-----------+--------+---------+

В основном кто-то в первой таблицеh «да» - это «дубликат», так как это один и тот же человек, посещающий одно и то же мероприятие с одинаковым типом посещаемости. Примечание: «Дубликат» в таблице - это не поле, а ключ к цели этого вопроса

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 голосов
/ 07 июня 2019

Вы можете отфильтровать дубликаты, проверив, что идентификатор является первым идентификатором, в котором указаны заданные значения, которые вы проверяете на наличие дубликатов

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, которые недоступны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...