你什么都没忽略。Access的数据库引擎将允许SELECT没有FROM数据源的单行。但是,如果你想UNION或UNION 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 strSqlEnd Sub
该Dual表对于以下查询很有用:SELECT "foo" AS my_textFROM DualUNION ALLSELECT "bar"FROM Dual;
我见过的另一种方法是使用SELECT带有TOP 1或WHERE子句的语句,将结果集限制为单行。
注意检查约束是随Jet 4添加的,仅可用于从ADO执行的语句。CurrentProject.Connection.Execute strSql之所以有效,CurrentProject.Connection是因为它是一个ADO对象。如果尝试使用DAO执行同CurrentDb.Execute一条语句(即从Access查询设计器或从Access查询设计器执行),则会收到语法错误,因为DAO无法创建检查约束。