Объединять различные таблицы с одинаковыми полями, но с изменением префикса в именах таблиц - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть разные таблицы в Access, все с одинаковыми полями, и я хотел бы объединить их в одну.Единственная проблема заключается в том, что они, когда я импортирую их, имеют разные имена - единственное, что у них есть, это USR02 .Я создал пустую таблицу с нужными столбцами под названием USR_02_ALL.Однако я не могу заполнить его данными из этой таблицы.Я использую Access 2016. Код, который я до сих пор получил (от кого-то):

Sub Buildquery()

Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim sqlFinal As String
Dim sql1 As String
On Error GoTo Buildquery_Error

sql1 = "SELECT * INTO USR_02_ALL FROM ( " & vbCrLf
Dim sql2 As String
sql2 = "SELECT * FROM "
Dim sql3 As String
sql3 = "UNION ALL "

Set db = CurrentDb 
sqlFinal = sql1

For Each tdf In db.TableDefs
    If tdf.Name Like "*" & "USR02" & "*" Then
        sqlFinal = sqlFinal & tdf.Name & " " & sql3 & sql2 & tdf.Name & vbCrLf
    End If
Next tdf

Debug.Print sqlFinal 'You can put this wherever you want
On Error GoTo 0
Exit Sub

Buildquery_Error:   
MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure Buildquery of Module AWF_Related"

End Sub

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Это ваш последний SQL на данный момент:

SELECT * INTO USR_02_ALL FROM ( 
A_USR02_A UNION ALL SELECT * FROM A_USR02_A
B_USR02_B UNION ALL SELECT * FROM B_USR02_B
C_USR02_C UNION ALL SELECT * FROM C_USR02_C  

Это должно выглядеть так, если вы вставляете в новую таблицу:

SELECT * INTO USR_02_ALL FROM
(
SELECT * FROM A_USR02_A
UNION ALL SELECT * FROM B_USR02_B
UNION ALL SELECT * FROM C_USR02_C
)   

или вот так, если выдобавляем к существующей таблице:

INSERT INTO USR_02_ALL 
SELECT      * 
FROM        (
            SELECT * FROM A_USR02_A 
            UNION ALL SELECT * FROM B_USR02_B 
            UNION ALL SELECT * FROM C_USR02_C
            )

Этот код будет создавать этот SQL (раскомментируйте строку SQLFinal в зависимости от того, какой тип запроса вы хотите использовать):

Public Sub BuildQuery()

    Dim SQLFinal As String
    Dim SQL1 As String
    Dim tdf As DAO.TableDef
    Dim qdf As DAO.QueryDef

    'Create a new table SQL
    'SQLFinal = "SELECT * INTO USR_02_ALL FROM (SELECT * FROM "

    'Append to existing table
    SQLFinal = "INSERT INTO USR_02_ALL SELECT * FROM (SELECT * FROM "

    SQL1 = " UNION ALL SELECT * FROM "

    For Each tdf In CurrentDb.TableDefs
        If tdf.Name Like "*USR02*" Then
            SQLFinal = SQLFinal & tdf.Name & SQL1
        End If
    Next tdf

    SQLFinal = Left(SQLFinal, Len(SQLFinal) - Len(SQL1)) & ")"

    CurrentDb.CreateQueryDef("", SQLFinal).Execute

End Sub

Обратите внимание, что в конце каждого оператора, готового для следующего имени таблицы, добавляется " UNION ALL SELECT * FROM ", а затем удаляется последний экземпляр этой текстовой строки.

0 голосов
/ 11 декабря 2018

Команда SELECT * INTO USR_02_ALL FROM... создаст новую таблицу с теми же полями, что и результат запроса.Когда вы написали «Я создал пустую таблицу ...», этот оператор завершится с ошибкой времени выполнения 3010 ( таблица уже существует ).

Если вы хотите вставить данные в существующуюТаблица, вы можете использовать команду INSERT into USR_02_ALL select * FROM....За исключением случаев, когда вы хотите избавиться от дубликатов, нет смысла объединять все ваши таблицы в один оператор.Вместо этого я зациклился бы над таблицами и выдал бы отдельное INSERT -Statement для каждой из них.Подробнее см., Например, https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/insert-into-statement-microsoft-access-sql

Кстати: как написал Натан в своем комментарии: вы не запускаете команду SQL.Вам необходимо добавить утверждение типа db.Execute sqlFinal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...