Вы ничего не пропустили. Ядро доступа к базе данных разрешит одну строку 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 strSql
End Sub
Эта таблица Dual
полезна для таких запросов:
SELECT "foo" AS my_text
FROM Dual
UNION ALL
SELECT "bar"
FROM Dual;
Другой подход, который я видел, заключается в использовании оператора SELECT
с предложением TOP 1
или WHERE
, который ограничивает набор результатов одной строкой.
Примечание. Проверочные ограничения были добавлены в Jet 4 и доступны только для операторов, выполняемых из ADO. CurrentProject.Connection.Execute strSql
работает, потому что CurrentProject.Connection
является объектом ADO. Если вы попытаетесь выполнить тот же оператор с DAO (например, CurrentDb.Execute
или из конструктора запросов Access), вы получите синтаксическую ошибку, потому что DAO не может создать проверочные ограничения.