Доступ: проблема с созданием представления SQL через VBA — объединения не разрешены в подзапросе

#sql #vba #ms-access #view #union

#sql #vba #ms-access #Вид #объединение

Вопрос:

Прежде всего, позвольте мне предварить это тем, что я почти всегда говорю в своих нескольких сообщениях до сих пор, а именно, что я не специалист в области ИТ / технологий. Я бухгалтер, который любит немного разбираться в 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, ВЫБЕРИТЕ * ИЗ обеих таблиц, а не из отдельных столбцов (обе таблицы представляют собой только 4 перечисленных столбца, которые также имеют один и тот же тип данных), а столбцы и таблицы не выровнены.

Я должен отметить, что, возможно, это может быть проблемой, но я бы не подумал, что это так, что «таблицы» в коде на самом деле являются представлениями, которые я создал в Access без VBA (как в обычном SQL). Теперь они отображаются в базе данных как «Запросы». Тем не менее, я написал VBA с исходным SQL, который определяет представления, и я вернул ту же ошибку. Так что я не думаю, что это проблема.

РЕДАКТИРОВАТЬ: Кроме того, я должен отметить, что для тестирования я смог создать представление из того же VBA для запроса верхнего уровня без ОБЪЕДИНЕНИЯ.

Во всяком случае, я не уверен, где находится подзапрос в SQL, так что, возможно, это синтаксическая ошибка?

Любая помощь будет с благодарностью принята. Спасибо!

Комментарии:

1. Довольно явное сообщение об ошибке. Я тестировал и определенно не работает с ОБЪЕДИНЕНИЕМ.

2. Подзапрос — это оператор SELECT .

3. Спасибо @June7. Я думаю, я не думаю о подзапросах в терминах объединений, т. Е. Это Два отдельных внешних запроса (не являющихся подзапросами), которые построены друг на друге, но, возможно, это неправильный способ взглянуть на это с технической точки зрения. Несмотря на это, судя по вашему тестированию, этот конкретный VBA не будет работать с UNION. Как вы думаете, существует ли какой-либо VBA, который существует или может быть создан для выполнения этой задачи? Я бы подумал, что то, что я пытаюсь сделать, не является сверхсложным, поэтому должно быть какое-то решение. Еще раз спасибо!

4. Возможно, использование QueryDefs будет работать с ОБЪЕДИНЕНИЕМ. Зачем вам нужно программно создавать объекты запроса?

Ответ №1:

QueryDefs может обрабатывать ОБЪЕДИНЕНИЕ. Имена полей псевдонимов и таблиц не нужны.

 Sub test()
Dim qdf As DAO.QueryDef
Set qdf = CurrentDb.CreateQueryDef("TestVW", "SELECT Unit, Spend, Date, Type FROM Table1 " amp; _
                                    "UNION ALL SELECT Unit, Spend, Date, Type FROM Table2;"
Application.RefreshDatabaseWindow
End Sub
 

Настоятельно рекомендую не использовать зарезервированные слова, такие как дата, в качестве имен.

Комментарии:

1. Определенно работает, и я не использовал 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" amp; vbCrLf amp; _
    "SELECT A.Unit, A.Spend, A.Date, A.Type FROM Table1 A" amp; vbCrLf amp; _
    "UNION ALL SELECT B.Unit, B.Spend, B.Date, B.Type FROM Table2 B;"
CurrentProject.Connection.Execute strSql