gpt4 book ai didi

sql - MS Access (Jet/ACE) 中的无表 UNION 查询

转载 作者:行者123 更新时间:2023-12-03 10:26:06 24 4
gpt4 key购买 nike

这按预期工作:

SELECT "Mike" AS FName

这失败并出现错误“查询输入必须包含至少一个表或查询”:
SELECT "Mike" AS FName
UNION ALL
SELECT "John" AS FName

这只是 Jet/ACE 数据库引擎的一个怪癖/限制还是我遗漏了什么?

最佳答案

你没有忽视任何事情。 Access 的数据库引擎将允许单行 SELECT没有 FROM数据源。但是如果你想UNIONUNION ALL多行,你必须包含一个 FROM ...即使您没有引用该数据源中的任何字段。

我创建了一个只有一行的表并添加了一个检查约束以保证它总是只有一行。

Public Sub CreateDualTable()
Dim strSql As String
strSql = "CREATE TABLE Dual (id COUNTER CONSTRAINT pkey PRIMARY KEY);"
Debug.Print strSql
CurrentProject.Connection.Execute strSql
strSql = "INSERT INTO Dual (id) VALUES (1);"
Debug.Print strSql
CurrentProject.Connection.Execute strSql

strSql = "ALTER TABLE Dual" & vbNewLine & _
vbTab & "ADD CONSTRAINT there_can_be_only_one" & vbNewLine & _
vbTab & "CHECK (" & vbNewLine & _
vbTab & vbTab & "(SELECT Count(*) FROM Dual) = 1" & vbNewLine & _
vbTab & vbTab & ");"
Debug.Print strSql
CurrentProject.Connection.Execute strSql
End Sub

那个 Dual表对于这样的查询很有用:

SELECT "foo" AS my_text
FROM Dual
UNION ALL
SELECT "bar"
FROM Dual;

我见过的另一种方法是使用 SELECT声明 TOP 1WHERE将结果集限制为单行的子句。

注意检查约束是随 Jet 4 添加的,仅适用于从 ADO 执行的语句。 CurrentProject.Connection.Execute strSql有效是因为 CurrentProject.Connection是一个 ADO 对象。如果您尝试使用 DAO(即 CurrentDb.Execute 或来自 Access 查询设计器)执行相同的语句,您将收到语法错误,因为 DAO 无法创建检查约束。

关于sql - MS Access (Jet/ACE) 中的无表 UNION 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7933518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com