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

Posted

技术标签:

【中文标题】访问:通过 VBA 创建 SQL 视图的问题 - 子查询中不允许联合【英文标题】:Access: Issue Creating SQL View Through VBA - Unions not allowed in subquery 【发布时间】:2020-12-22 14:23:46 【问题描述】:

首先,让我以我在迄今为止的几篇文章中几乎总是说的话作为开头,那就是我不是 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, SELECT * FROM 两个表而不是单个列(两个表都只是列出的 4 个列,它们也是相同的数据类型),并且列和表没有别名。

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

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

无论如何,我不确定子查询在 SQL 中的位置,所以可能是语法错误?

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

【问题讨论】:

相当明确的错误信息。我测试过,绝对不能使用 UNION。 子查询是SELECT语句。 谢谢@June7。我想我不会从联合的角度考虑子查询,即这些是两个独立的外部查询(非子查询),它们建立在彼此之上,但从技术角度来看,这可能是错误的方式。无论如何,根据您的测试,这个特定的 VBA 不适用于 UNION。您认为是否存在或可以创建一些 VBA 来执行此任务?我认为我正在尝试做的并不是超级复杂,所以应该有一些解决方案。再次感谢! 也许使用 QueryDefs 可以与 UNION 一起使用。为什么需要以编程方式构建查询对象? 【参考方案1】:

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 作为名称。谢谢!【参考方案2】:

错误消息,“子查询中不允许使用联合”,对您的情况不是很有帮助。

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

【讨论】:

以上是关于访问:通过 VBA 创建 SQL 视图的问题 - 子查询中不允许联合的主要内容,如果未能解决你的问题,请参考以下文章

Access VBA中的计数SQL语句

使用 Access 2007 查询向导创建 SQL,仍然无法在 VBA 中运行

直接和通过 VBA excel 运行相同的存储 Access SQL 查询时获得不同的结果

如何通过vba查看访问表中的记录集?

使用 VBA 从 SQL Server 查询 VIEW

访问 vba 在数据表视图中选择新的原始数据