Можно ли выполнить запрос make table, используя набор записей в качестве источника в MS Access (VBA)? - PullRequest
0 голосов
/ 01 июля 2019

У меня есть база данных MS Access, и я пытаюсь дедуплицировать таблицу с именем tblPrevious.Я создал набор записей, который выбирает только отдельные значения из таблицы, и я хотел бы использовать этот набор записей для перезаписи исходной таблицы.Я не могу использовать обычный запрос make table, потому что я не могу использовать tblPrevious в качестве таблицы назначения и исходной таблицы.Поэтому я планирую создать набор записей через vba, затем удалить исходную таблицу, а затем использовать набор записей, чтобы заполнить новую таблицу с тем же именем, что и исходная tblPrevious.Другой вариант - создать новую таблицу с именем tblPrevious2, затем удалить tblPrevious, затем переименовать tblPrevious2 в tblPrevious.Это кажется мне слишком грязным.Ниже приведена попытка vba, но я получил сообщение об ошибке «Runtim Error 3078: ядро ​​базы данных Microsoft Access не может найти входную таблицу или запрос« rst ». Заранее спасибо за помощь!

Sub RemovePreviousDupes()


Dim rst As Recordset Set rst = CurrentDb.OpenRecordset(Name:="DeDupetblPreviousExport", Type:=RecordsetTypeEnum.dbOpenDynaset)

strSQL = "SELECT rst.* INTO DELETETABLE FROM rst;"

DoCmd.RunSQL (strSQL)


End Sub

Добавлен SQL для DeDupetblPreviousExport. Также обратите внимание, что в приведенном выше коде я просто пытаюсь записать набор записей в новую таблицу, если бы я заставил его работать, я бы затем попытался сбросить tblPrevious и последнийстрока выше будет писать в tblPrevious вместо DELETETABLE

SELECT DISTINCT tblPreviousExport.[Month Reported], tblPreviousExport.[Employee SSN],   
                tblPreviousExport.[Employee First Name], tblPreviousExport.[Employee Last Name], 
                tblPreviousExport.Pool, tblPreviousExport.OpCo, tblPreviousExport.Paygroup, 
                tblPreviousExport.[Effective Date], tblPreviousExport.[Medical Plan], 
                tblPreviousExport.[Coverage Level], tblPreviousExport.Type, 
                tblPreviousExport.[Tier Change Effective Date], tblPreviousExport.[Num Eligible Months], 
                tblPreviousExport.[Employee Ongoing Contribution], 
                tblPreviousExport.[Full Employer Contribution], 
                tblPreviousExport.[Prorated Employer Contribution],
                tblPreviousExport.[ER Contribution Already Received], 
                tblPreviousExport.[Total Contribution], tblPreviousExport.[Max Contribution]
FROM tblPreviousExport;

Ответы [ 3 ]

2 голосов
/ 01 июля 2019

Предполагая, что ваша таблица поддерживает уникальный первичный ключ, такой как автономный номер, id , рассмотрите возможность использования чистого SQL для устранения дублирования исходной таблицы и избежания временных таблиц или наборов записей.В частности, запустите DELETE с предложением IN, чтобы сохранить минимальное значение id , соответствующее всем соответствующим столбцам.

DELETE FROM tblPreviousExport main
WHERE id IN 
  (SELECT sub.id
   FROM tblPreviousExport sub
   WHERE sub.id > main.id
     AND sub.[Month Reported] = main.[Month Reported]
     AND sub.[Employee SSN] = main.[Employee SSN]
     AND sub.[Employee First Name] = main.[Employee First Name]
     AND sub.[Employee Last Name] = main.[Employee Last Name]
     AND sub.Pool = main.Pool 
     AND sub.OpCo = main.OpCo 
     AND sub.Paygroup = main.Paygroup 
     AND sub.Pool = main.Pool
     AND sub.[Effective Date] = main.[Effective Date] 
     AND sub.[Medical Plan] = main.[Medical Plan] 
     AND sub.[Coverage Level] = main.[Coverage Level]
     AND sub.Type = main.Type 
     AND sub.[Tier Change Effective Date] = main.[Tier Change Effective Date]
     AND sub.[Num Eligible Months] = main.[Num Eligible Months]
     AND sub.[Employee Ongoing Contribution] = main.[Employee Ongoing Contribution]
     AND sub.[Full Employer Contribution] = main.[Full Employer Contribution]
     AND sub.[Prorated Employer Contribution] = main.[Prorated Employer Contribution]
     AND sub.[ER Contribution Already Received] = main.[ER Contribution Already Received]
     AND sub.[Total Contribution] = main.[Total Contribution]
     AND sub.[Max Contribution] = main.[Max Contribution])

Или с предложением EXISTS:

DELETE FROM tblPreviousExport main
WHERE id EXISTS
  (SELECT 1
   FROM tblPreviousExport sub
   WHERE sub.id > main.id
     AND sub.[Month Reported] = main.[Month Reported]
     AND sub.[Employee SSN] = main.[Employee SSN]
     AND sub.[Employee First Name] = main.[Employee First Name]
     AND sub.[Employee Last Name] = main.[Employee Last Name]
     AND sub.Pool = main.Pool 
     AND sub.OpCo = main.OpCo 
     AND sub.Paygroup = main.Paygroup 
     AND sub.Pool = main.Pool
     AND sub.[Effective Date] = main.[Effective Date] 
     AND sub.[Medical Plan] = main.[Medical Plan] 
     AND sub.[Coverage Level] = main.[Coverage Level]
     AND sub.Type = main.Type 
     AND sub.[Tier Change Effective Date] = main.[Tier Change Effective Date]
     AND sub.[Num Eligible Months] = main.[Num Eligible Months]
     AND sub.[Employee Ongoing Contribution] = main.[Employee Ongoing Contribution]
     AND sub.[Full Employer Contribution] = main.[Full Employer Contribution]
     AND sub.[Prorated Employer Contribution] = main.[Prorated Employer Contribution]
     AND sub.[ER Contribution Already Received] = main.[ER Contribution Already Received]
     AND sub.[Total Contribution] = main.[Total Contribution]
     AND sub.[Max Contribution] = main.[Max Contribution])
2 голосов
/ 01 июля 2019

Неа. Вы не можете выполнять запросы действий с наборами записей в качестве источника (или на самом деле, любого запроса).

Вместо этого используйте источник набора записей в качестве источника для вашего запроса.

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

0 голосов
/ 13 июля 2019

Вы были очень близки к решению, когда заявили: Другой вариант - создать новую таблицу с именем tblPrevious2, затем удалить tblPrevious, а затем переименовать tblPrevious2 в tblPrevious

Вместо этого легко сработает: создайте новую таблицу с именем tblPrevious2, затем удалите ЗАПИСИ tblPrevious (НЕ САМОСТОЯТЕЛЬНО ТАБЛИЦЫ) с помощью простого запроса на удаление, затем добавьте записи tblPrevious2 в tblPrevious

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