#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