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