访问:通过 VBA 创建 SQL 视图的问题 - 子查询中不允许联合



首先,让我用我迄今为止在几篇文章中几乎总是说的话来开头,那就是我不是IT/技术人员。我是一名会计师,喜欢涉足SQL等,但对VBA的了解很少,所以如果这是一个超级简单的问题或已经涵盖,我提前道歉。但是我找不到与此特定错误直接相关的任何内容。

尝试使用 MS Access 从包含联合的 SQL 创建视图,并收到以下错误:运行时错误"-2147217900 (800040e14)":子查询中不允许联合。代码如下:

Sub Create_View()
Dim conn As ADODB.Connection
Set conn = CurrentProject.Connection
conn.Execute "CREATE VIEW Test_VW AS SELECT A.Unit as Unit, A.Spend as Spend, A.Date as Date, A.Type as Type FROM Table1 A UNION ALL SELECT B.Unit as Unit, B.Spend as Spend, B.Date as Date, B.Type as Type FROM Table2 B;"
Application.RefreshDatabaseWindow 
End Sub

这是现在的代码,但我也尝试了 UNION 而不是 UNION ALL,从两个表中选择 *,而不是单独的列(两个表只是列出的 4 列,它们也是相同的数据类型),并且列和表没有别名。

我应该指出的可能是问题所在,但我不认为是代码中的"表"实际上是我在没有 VBA 的 Access 中创建的视图(就像在常规 SQL 中一样)。这些查询现在在数据库中显示为"查询"。但是,我确实使用定义视图的初始SQL编写了VBA,并且返回了相同的错误。所以我不认为这是问题所在。

编辑:另外,我应该指出,为了进行测试,我能够从同一个VBA为没有UNION的顶级查询创建一个视图。

无论如何,我不确定子查询在 SQL 中的位置,所以也许这是一个语法错误?

任何帮助将不胜感激。谢谢!

该错误消息"子查询中不允许联合">在您的情况下不是很有帮助。

Access 支持 2 种与查询相关的 DDL 操作:CREATE VIEW; 和CREATE PROCEDURE

CREATE VIEW只能用于简单的SELECT查询。CREATE PROCEDURE必须用于更复杂的SELECT查询(如UNION)和"操作"查询。

因此,您可以通过使用CREATE PROCEDURE而不是CREATE VIEW来避免当前错误。 但是,由于未带括号的保留字用作列别名,您随后会遇到不同的错误,"SELECT 语句包含拼写错误或丢失的保留字或参数名称,或者标点符号不正确"。您可以删除不需要的列别名以避免该错误。

这是对在 Access 2010 中对我有用的代码的改编。

Dim strSql As String
strSql = "CREATE PROCEDURE Test_VW AS" & vbCrLf & _
"SELECT A.Unit, A.Spend, A.Date, A.Type FROM Table1 A" & vbCrLf & _
"UNION ALL SELECT B.Unit, B.Spend, B.Date, B.Type FROM Table2 B;"
CurrentProject.Connection.Execute strSql

QueryDefs 可以处理 UNION。不需要别名字段和表名。

Sub test()
Dim qdf As DAO.QueryDef
Set qdf = CurrentDb.CreateQueryDef("TestVW", "SELECT Unit, Spend, Date, Type FROM Table1 " & _
"UNION ALL SELECT Unit, Spend, Date, Type FROM Table2;"
Application.RefreshDatabaseWindow
End Sub

强烈建议不要使用保留字(如 Date)作为名称。

最新更新