2014-12-12 3 views
1

Мне нужно создать несколько запросов, связанных с каким-то UNION. Единственный способ, которым я смог это понять, - это ниже. Есть ли способ упростить процесс, поэтому мне не нужен отдельный союз для каждой таблицы? (У меня есть около 50 столов и не хотят, чтобы сделать это для каждого) - Работа с БД AccessUNION полей выбора из нескольких таблиц

ВЫБРАТЬ Header1, Заголовок 2, Заголовок 3, заголовок 4
ОТ score_ADACOMPT
UNION

ВЫБОР hEADER1, header2, заголовок 3, заголовок 4
ОТ score_ADADESG
СОЕДИНЕНИЕ

ВЫБОР header1, заголовок 2, заголовок 3, 4 заголовка
ОТ Score_API
СОЕДИНЕНИЕ

ВЫБОР Header1, Заголовок 2, Заголовок 3, заголовок 4
ОТ score_COMPCAC
СОЕДИНЕНИЕ

ВЫБОР Header1, Заголовок 2, Заголовок 3, заголовок 4
ОТ Score_CRV
СОЕДИНЕНИЕ

ответ

1

Я считаю вы столкнетесь с несколькими препятствиями с этим подходом. Я никогда не нашел официальную документацию, но Access может обрабатывать только столько операций UNION за раз. Это зависит от того, насколько сложны операции и запросы. Вы можете попытаться написать VBA для создания синтаксиса запроса UNION и посмотреть, сможет ли Access обработать его. Если да, то подумайте, что вам повезло.

В качестве альтернативы вам может потребоваться создать таблицу для хранения этих значений и выполнить команду append query для загрузки данных в эту таблицу. У этого есть плюсы и минусы, в зависимости от среды приложения, и то, что вы планируете делать с данными после объединения.

Пример Переберите DAO TableDefs и создать UNION запрос:

Public Sub TestIt() 

    BuildUNIONQuery "UNIONTest" 
End Sub 

Public Sub BuildUNIONQuery(saveQueryName As String) 
'builds a large union query for queries starting with "score_" and contains fields: Header1, Header2, header 3, header 4 

    Dim qryStr As String 
    Dim tDef As DAO.TableDef 
    Dim qDef As DAO.QueryDef 
    Dim db As DAO.Database 

    Set db = Access.CurrentDb 
    qryStr = "" 

    For Each tDef In db.TableDefs 

     If tDef.Name Like "score_*" Then 

      qryStr = qryStr & "SELECT [Header 1], [Header 2], [header 3], [header 4] " 
      qryStr = qryStr & "FROM [" & tDef.Name & "] " 
      qryStr = qryStr & "UNION " 

     End If 
    Next tDef 

    'remove last UNION from string 
    If Len(qryStr) > 0 Then 
     qryStr = Left(qryStr, Len(qryStr) - 6) 
    End If 

    If QueryExists(saveQueryName) Then 'query exits update SQL for current item 

     Set qDef = db.QueryDefs(saveQueryName) 

     qDef.SQL = qryStr 
     db.QueryDefs.Refresh 

    Else 

     Set qDef = db.CreateQueryDef(saveQueryName, qryStr) 

     db.QueryDefs.Refresh 
    End If 
End Sub 

Public Function QueryExists(qName As String) As Boolean 
'determine if query name already exists in the database 

    Dim qDef As DAO.QueryDef 
    Dim db As DAO.Database 

    Set db = Access.CurrentDb 
    QueryExists = False 

    For Each qDef In db.QueryDefs 
     If qDef.Name = qName Then 
      QueryExists = True 
      Exit Function 
     End If 
    Next qDef 

End Function

+0

Я не был в состоянии выяснить способ, чтобы написать VBA для создания синтаксиса UNION запросов. Я довольно новичок в VBA и SQL (практически любой тип кода). Я использовал мой метод для UNION из 17 запросов, но это очень утомительно. После объединения данных я создаю «мастер-лист», вытягивая исходные данные и комбинированные данные - много утомительной работы, но это нужно сделать. – MrAlex

+0

Ну, я попал в дорожный блок. Я не задаю «слишком сложный запрос» или «превышен системный ресурс». Я действительно застрял здесь. Данные, которые у меня есть, должны обновляться, вероятно, ежемесячно, поэтому я не могу просто экспортировать в excel и комбинировать результаты отдельно, иначе это займет слишком много времени. – MrAlex

+0

В этом примере вы должны начать цикл через Таблицы/Запросы, чтобы построить большой запрос UNION или выполнить предварительно определенные запросы на добавление. Код потребует некоторых изменений в зависимости от ваших точных требований. Надеюсь, поможет. – Fink

Смежные вопросы