Как обновить таблицы из внешней базы данных Access с идентичными таблицами? - PullRequest
0 голосов
/ 12 декабря 2018

Используя MS Access, через VBA я пытался обновить основную таблицу базы данных Access из идентично структурированной таблицы внешней базы данных Access.Те же столбцы, те же поля.Внешние базы данных используются для обновления центральной главной базы данных.

То, что я пытался разработать, - это строка SQL, которая добавляет только те записи, которые полностью уникальны.Поскольку нет никаких внешних ключей или уникальных идентификаторов для входящих данных, на которые можно ссылаться, я должен проверить каждое поле, чтобы убедиться, что нет точных дубликатов.Итак, если в таблице есть 2 поля, если записи не пройдут логический тест
intTable.field1 = extTable.field1 And intTable.field2 = extTable.field2
, то это те записи, которые будут добавлены.

Код, который я придумал, приведен ниже, икогда он работает, он пытается добавить (голосом Гэри Олдмана) ВСЕ.Я не могу выяснить, что может быть не так с ним, так как он почти игнорирует WHERE или WHERE NOT EXIST.Я перепробовал десятки небольших правок и альтернативных версий.Любой из них добавляет все или ничего.

INSERT INTO Table1 
SELECT field1, field2, field3, field4, field5
FROM [;DATABASE=C:\extDB.accdb].[Table1] sourceDB 
WHERE NOT EXISTS (SELECT * 
                  FROM [;DATABASE=C:\extDB.accdb].[Table1] sourceDB1 
                  WHERE ('Table1.[field1]'='sourceDB1.[field1]' And 
                         'Table1.[field2]'='sourceDB1.[field2]' And 
                         'Table1.[field3]'='sourceDB1.[field3]' And 
                         'Table1.[field4]'='sourceDB1.[field4]' And 
                         'Table1.[field5]'='sourceDB1.[field5]'));

ФИНАЛЬНЫЙ КОД (после реализации решения ArcherBird):

INSERT INTO Table1 
SELECT field1, field2, field3, field4, field5
FROM [;DATABASE=C:\extDB.accdb].[Table1] sourceDB 
WHERE NOT EXISTS (SELECT * 
                  FROM [;DATABASE=C:\extDB.accdb].[Table1] sourceDB1 
                  WHERE ((sourceDB.[field1] = sourceDB1.[field1] Or (sourceDB.[field1] IS NULL And sourceDB1.[field1] IS NULL)) And 
                         (sourceDB.[field2] = sourceDB1.[field2] Or (sourceDB.[field2] IS NULL And sourceDB1.[field2] IS NULL)) And 
                         (sourceDB.[field3] = sourceDB1.[field3] Or (sourceDB.[field3] IS NULL And sourceDB1.[field3] IS NULL)) And 
                         (sourceDB.[field4] = sourceDB1.[field4] Or (sourceDB.[field4] IS NULL And sourceDB1.[field4] IS NULL)) And 
                         (sourceDB.[field5] = sourceDB1.[field5] Or (sourceDB.[field5] IS NULL And sourceDB1.[field5] IS NULL)) ));

1 Ответ

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

1) Удалите строковые кавычки из вашей логики сравнения полей.

2) Вы указали псевдоним Table1 в своем запросе как sourceDB, поэтому используйте эту ссылку.

3)Таблица, в которой вы проверяете небытие, должна быть "локальной" версией Table1 (той, в которую вы вставляете).

INSERT INTO Table1 
SELECT field1, 
       field2, 
       field3, 
       field4, 
       field5
FROM [;DATABASE=C:\extDB.accdb].[Table1] sourceDB
WHERE NOT EXISTS (SELECT * 
                  FROM [Table1] sourceDB1 
                  WHERE (sourceDB.[field1] = sourceDB1.[field1] And 
                         sourceDB.[field2] = sourceDB1.[field2] And 
                         sourceDB.[field3] = sourceDB1.[field3] And 
                         sourceDB.[field4] = sourceDB1.[field4] And 
                         sourceDB.[field5] = sourceDB1.[field5]));

РЕДАКТИРОВАТЬ:

Для работы сВ случае, когда эти поля могут иметь значения null, вы не можете выполнить простое сравнение =, поскольку null не равно null.Лучший способ обойти это в MS Access - заменить null другим значением, которое вряд ли будет использовано.При этом вам также необходимо убедиться, что вы выбрали значения замены, которые соответствуют типу данных.Я сделаю предположение, что все ваши поля являются текстовыми.

INSERT INTO Table1 
    SELECT field1, 
           field2, 
           field3, 
           field4, 
           field5
    FROM [;DATABASE=C:\extDB.accdb].[Table1] sourceDB
    WHERE NOT EXISTS (SELECT * 
                      FROM [Table1] sourceDB1 
                      WHERE (nz(sourceDB.[field1],"!@#") = nz(sourceDB1.[field1],"!@#") And 
                             nz(sourceDB.[field2],"!@#") = nz(sourceDB1.[field2],"!@#") And 
                             nz(sourceDB.[field3],"!@#") = nz(sourceDB1.[field3],"!@#") And 
                             nz(sourceDB.[field4],"!@#") = nz(sourceDB1.[field4],"!@#") And 
                             nz(sourceDB.[field5],"!@#") = nz(sourceDB1.[field5],"!@#")));
...