如何从Access VBA中的SELECT查询创建临时表?

时间:2012-01-11 22:07:13

标签: sql ms-access vba ms-access-2003

我正在尝试从Access VBA中的小功能方法中的查询中获取一些结果(仅供查看)。查询如下所示:

sqlstr = "TRANSFORM Count([Deal Data ECM].[Disclosed Fees (Y/N)]) AS [CountOfDisclosed Fees (Y/N)]" & _
"SELECT [Deal Data ECM].[Deal Type]" & _
"FROM [Deal Data ECM]" & _
"WHERE ((([Deal Data ECM].[Disclosed Fees (Y/N)]) = 'Y'))" & _
"GROUP BY [Deal Data ECM].[Deal Type]" & _
"PIVOT [Deal Data ECM].[Deal Region];"

这些都不起作用:

DoCmd.OpenQuery sqlstr
CurrentDb.OpenRecordset sqlstr
DoCmd.RunSQL sqlstr

我怎样才能让它发挥作用?这个简单的任务必须有一个简单的方法。我正在使用Access 2003。

3 个答案:

答案 0 :(得分:1)

如果您在代码中使用Debug.Print sqlstr或从命令窗口?sqlstr查看您生成的字符串,则会看到

TRANSFORM Count([Deal Data ECM].[Disclosed Fees (Y/N)]) AS [CountOfDisclosed Fees (Y/N)]SELECT [Deal Data ECM].[Deal Type]FROM [Deal Data ECM]WHERE ((([Deal Data ECM].[Disclosed Fees (Y/N)]) = 'Y'))GROUP BY [Deal Data ECM].[Deal Type]PIVOT [Deal Data ECM].[Deal Region];

然后您可能会注意到一个子句与下一个子句之间没有空格。

在有空格的地方添加回报可以让它看起来更加简单

TRANSFORM Count([Deal Data ECM].[Disclosed Fees (Y/N)]) 
    AS [CountOfDisclosed Fees (Y/N)]SELECT 
    [Deal Data ECM].[Deal Type]FROM
   [Deal Data ECM]WHERE
   ((([Deal Data ECM].[Disclosed Fees (Y/N)]) = 'Y'))GROUP 
   BY [Deal Data ECM].[Deal Type]PIVOT
   [Deal Data ECM].[Deal Region];

尝试在每个结尾"

之前添加空格
sqlstr = "TRANSFORM Count([Deal Data ECM].[Disclosed Fees (Y/N)]) AS [CountOfDisclosed Fees (Y/N)] " & _
"SELECT [Deal Data ECM].[Deal Type] " & _
"FROM [Deal Data ECM] " & _
"WHERE ((([Deal Data ECM].[Disclosed Fees (Y/N)]) = 'Y')) " & _
"GROUP BY [Deal Data ECM].[Deal Type] " & _
"PIVOT [Deal Data ECM].[Deal Region]; "

但是,由于您要创建表格,因此需要添加目标。通过在select和from

之间添加INTO子句
sqlstr = "TRANSFORM Count([Deal Data ECM].[Disclosed Fees (Y/N)]) AS [CountOfDisclosed Fees (Y/N)] " & _
"SELECT [Deal Data ECM].[Deal Type] " & _
"INTO YourNewTable " & _
"FROM [Deal Data ECM] " & _
"WHERE ((([Deal Data ECM].[Disclosed Fees (Y/N)]) = 'Y')) " & _
"GROUP BY [Deal Data ECM].[Deal Type] " & _
"PIVOT [Deal Data ECM].[Deal Region]; "

注意:每次执行此操作时,您都将删除旧表。另请注意,您应该使用DoCmd.RunSQL

答案 1 :(得分:0)

DoCmd.RunSQL无法与SELECT次查询一起使用,您需要执行INSERTUPDATEDELETE

一种选择是在数据库中创建一个与查询输出匹配的表并执行INSERT ... SELECT ...。然后,您可以向用户显示该表。

这种方法的问题是每次再次运行查询之前都需要删除表内容。

答案 2 :(得分:0)

您可以使用嵌套查询来创建表。我无法嵌套sql,但如果您将查询保存为deal_time,那么您可以使用docmd.runSQL "select * into mytable from deal_time"