Попытка объединить похожие записи в Microsoft Access

#sql #ms-access #vba

#sql #ms-access #vba

Вопрос:

В настоящее время у меня есть две таблицы в Microsoft Access, содержащие данные за два отдельных дня. Большая часть данных не важна, но есть две категории именования (Name1, Name2 для целей этого поста). Я пытаюсь проверить, все ли пары Name1 / Name2 в Table1 также находятся в Table2. Если таковых нет, я хочу добавить их в другую таблицу MissingData.

Это осложняется размером баз данных и тем фактом, что часто встречаются дубликаты одного имени. Например, упрощенный вид таблиц будет выглядеть примерно так:

Таблица1 — Имя1 / Другие данные / Имя2 // A / 2 / Z // A / Apple / Y //B / Bat / Y

Таблица2 — Имя1 / Другие данные / Имя2 // A / Оранжевый / Z // B / 56 / Y //A / Случайный / X

В этом случае я бы хотел, чтобы функция поместила строку A / Apple / Y из Table1 в таблицу MissingData.

Вот код, который у меня есть на данный момент. Это почти работает, но имеет одну небольшую проблему; дублирующий экземпляр Name1 будет отображаться как отсутствующий, если порядок совпадающих данных Name2 не такой, как в Table2. Например, если в таблице 1 есть A / X, A / Y и A / Z, а в таблице 2 есть A / Z, A / X и A / Y, данные сообщаются как отсутствующие (Примечание — я не уверен, что порядок является виновником, но это мое предположение).

Заранее спасибо за вашу помощь.

 Public Sub SaleSorter()
Dim db As DAO.Database
Dim dest As String
Set db = CurrentDb

Dim sqry7 As String
sqry7 = "INSERT INTO MissingData(dest) SELECT * FROM Tester1 WHERE NOT EXISTS (SELECT * FROM Tester2 WHERE Tester1.[Name1] = Tester2.[Name1] AND Tester1.[Name2] = Tester2.[Name2] )"
DoCmd.RunSQL sqry7

End Sub
  

* dest — это просто строка всех имен полей в таблице, в предыдущей части функции я опустил.

Ответ №1:

Я бы взглянул на EXCEPT и INTERSECT. Вы можете использовать EXCEPT, чтобы определить, какие имена являются первой таблицей, а не второй таблицей, в то время как INTERSECT вернет только те имена, которые есть как в первой, так и во второй таблице.

 -- this assumes table3 is your 'missing persons' table

-- add anyone that is in table1 and not in table2
INSERT INTO #table3
SELECT Name1, Name2 FROM #table1
EXCEPT 
SELECT Name1, Name2 FROM #table2

-- add anyone that is in table2 and not in table1
INSERT INTO #table3
SELECT Name1, Name2 FROM #table2
EXCEPT 
SELECT Name1, Name2 FROM #table1
  

Комментарии:

1. Спасибо за вашу помощь. Однако я получаю сообщение об ошибке, в котором говорится о синтаксической ошибке в предложении FROM. Быстрый поиск в Google подсказал мне, что предложение Except нельзя использовать в Microsoft Access. Это правда?

2. Извините, похоже, вы правы — это работает в SQL, но не Access. Моя ошибка. Я думаю, что функция «Найти непревзойденный» может быть заменой, на которую стоит обратить внимание: office.microsoft.com/en-us/access-help /…