访问:问题创建 SQL 通过 VBA 查看 - 子查询中不允许联合
Access: Issue Creating SQL View Through VBA - Unions not allowed in subquery
首先,让我以迄今为止在我的几篇帖子中几乎总是说的话作为序言,即我不是 IT/tech 人。我是一名会计师,喜欢涉足 SQL 等等,但对 VBA 的了解很少覆盖。但是我找不到与此特定错误直接相关的任何内容。
尝试使用 MS Access 从 SQL 创建包含联合的视图并出现以下错误:运行-time error '-2147217900 (800040e14)': Union not allowed in一个子查询。代码如下:
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,SELECT * FROM 两个表而不是单独的列(两个表都只是列出的 4 个列,它们也是相同的数据类型),并且列和表没有别名。
我应该指出的一点可能是问题所在,但我不认为代码中的“表”实际上是我在没有 VBA 的情况下在 Access 中创建的视图(因为只是常规 SQL)。这些现在在数据库中显示为“查询”。但是,我确实用定义视图的初始 SQL 编写了 VBA,但我返回了相同的错误。所以我认为这不是问题所在。
编辑:另外,我应该指出,为了测试,我能够从相同的 VBA 为没有 UNION 的顶级查询创建视图。
无论如何,我不确定子查询在 SQL 中的什么位置,所以可能是语法错误?
如有任何帮助,我们将不胜感激。谢谢!
QueryDefs 可以处理 UNION。不需要别名字段和 table 名称。
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
强烈建议不要使用日期等保留字作为名称。
该错误消息“子查询中不允许使用联合”,对您的情况不是很有帮助。
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
首先,让我以迄今为止在我的几篇帖子中几乎总是说的话作为序言,即我不是 IT/tech 人。我是一名会计师,喜欢涉足 SQL 等等,但对 VBA 的了解很少覆盖。但是我找不到与此特定错误直接相关的任何内容。
尝试使用 MS Access 从 SQL 创建包含联合的视图并出现以下错误:运行-time error '-2147217900 (800040e14)': Union not allowed in一个子查询。代码如下:
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,SELECT * FROM 两个表而不是单独的列(两个表都只是列出的 4 个列,它们也是相同的数据类型),并且列和表没有别名。
我应该指出的一点可能是问题所在,但我不认为代码中的“表”实际上是我在没有 VBA 的情况下在 Access 中创建的视图(因为只是常规 SQL)。这些现在在数据库中显示为“查询”。但是,我确实用定义视图的初始 SQL 编写了 VBA,但我返回了相同的错误。所以我认为这不是问题所在。
编辑:另外,我应该指出,为了测试,我能够从相同的 VBA 为没有 UNION 的顶级查询创建视图。
无论如何,我不确定子查询在 SQL 中的什么位置,所以可能是语法错误?
如有任何帮助,我们将不胜感激。谢谢!
QueryDefs 可以处理 UNION。不需要别名字段和 table 名称。
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
强烈建议不要使用日期等保留字作为名称。
该错误消息“子查询中不允许使用联合”,对您的情况不是很有帮助。
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