繁体   English   中英

是否可以使用记录集作为MS Access(VBA)中的源来运行生成表查询?

[英]Is it possible to run a make table query using a recordset as the source in MS Access (VBA)?

我有一个MS Access数据库,并且正在尝试对名为tblPrevious的表进行重复数据删除。 我创建了一个记录集,该记录集仅从表中选择不同的值,并且我想使用该记录集覆盖原始表。 我无法使用普通的make表查询,因为我不能使用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

DeDupetblPreviousExport添加了SQL。 还要注意,在上面的代码中,我只是尝试将记录集写到新表中,如果要使其工作,我将尝试删除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;

不。 您不能将记录集作为源来运行操作查询(或者实际上是任何查询)。

而是,使用记录集的源作为查询的源。

如果要将记录集写入表,还可以考虑通过VBA创建表,然后使用循环将记录写入表中。

假设您的表维护一个唯一的主键,例如自动编号id ,请考虑使用纯SQL对原始表进行重复数据删除,并避免使用临时表或记录集。 具体来说,请使用IN子句运行DELETE ,以保持对应于所有匹配列的最小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])

声明时,您与解决方案非常接近:我的另一个选择是创建一个名为tblPrevious2的新表,然后删除tblPrevious,然后将tblPrevious2重命名为tblPrevious

相反,将很容易工作的是:创建一个名为tblPrevious2的新表,然后通过一个简单的Delete Query删除tblPrevious的记录(NOT THE TABLE ITSELF),然后将tblPrevious2记录追加到tblPrevious

谢谢大家的回应,感谢您提供帮助。 我最终做的是我原本以为是一种混乱的方式,但最终要容易得多。 我运行了一个生成表查询,仅选择不同的记录,并将新表命名为tblPrevious2。 然后我只运行了DoCmd.Rename "tblPrevious", acTable, "tblPrevious2" ,它只是用新表替换了旧表。 这比我预期的要干净得多,而且效果很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM