MS Access 2010: удаление дубликатов без первичного ключа - PullRequest
0 голосов
/ 21 июля 2011

Я работаю для клиента, который получает данные в таблицах Excel, но хочет импортировать данные в таблицу Access.Поля для записей данных:

-InvoiceNum -InvoiceDate -Customer -ShipDate -Quantity -Item -PriceEach

Он получает данные два раза в месяц, и каждый раз, когда он получает данные, он хочетчтобы иметь возможность импортировать данные в таблицу в Access.

Есть две проблемы, которые вызывают у меня проблему: 1) Нет первичного ключа для данных (ближайшее поле к первичному ключу - "InvoiceNum ", но, к сожалению, несколько записей могут иметь одну и ту же строку для этого поля);2) Возможны дубликаты записей, где под «дубликатами записей» я подразумеваю две записи, которые имеют одинаковые значения для каждого поля.

Проблема в том, что нам не нужны дубликаты записей в таблице данных.

Я не знаю, как лучше всего справиться с этим.Я надеюсь на некоторые предложения, касающиеся следующего:

a) Должен ли я хранить все записи в электронной таблице Excel, которая связана с таблицей Access?Я думал, что если я сделаю это, то я могу добавить каждый новый набор данных в эту электронную таблицу (включая дубликаты), а затем написать макрос в Excel для удаления дубликатов (я заметил, что я могу сделать это с помощью команды «Удалить дубликаты»)на вкладке «Данные»).

или

б) Должен ли я хранить данные непосредственно в таблице доступа?Я могу написать какую-нибудь программу VBA или макрос для импорта каждого нового набора данных Excel в таблицу Access, но есть ли способ выполнить этот импорт, который может устранить дубликаты (опять же, в таблице нет первичного ключа)?

или

в) Есть ли другой вариант, который лучше, чем другие два выше?

Спасибо за любую помощь в этом!Я действительно ценю это!

Ответы [ 2 ]

0 голосов
/ 23 июля 2011

Если вы не можете сделать то, что предлагает @Catcall (т. Е. Исправить процесс, который производит дубликаты), я бы сделал это следующим образом:

  • создать промежуточную таблицу вДоступ.Его функция заключается в том, чтобы быть буферной таблицей для каждого импорта, и очищается после использования.

  • импорт в нее с использованием предоставленного метода @HansUp (т. Е. Строки SQL со строкой соединенияв предложении IN).

  • , а затем используйте запрос с левым соединением к существующим счетам, чтобы найти новые:

SELECT tblBuffer.InvoiceNum, tblBuffer.InvoiceDate, tblBuffer.Customer, tblBuffer.ShipDate, tblBuffer.Quantity, tblBuffer.Item, tblBuffer.PriceEach 
      FROM tblBuffer LEFT JOIN tblInvoices 
        ON tblBuffer.InvoiceNum = tblInvoices.InvoiceNum
      WHERE tblInvoices.InvoiceNum Is Null

Это даст вам новые счета, и вы можете легко превратить их в команду INSERT для вставки этих записей:

      INSERT INTO tblInvoices (InvoiceNum, InvoiceDate, Customer, ShipDate, Quantity, Item, PriceEach)
      SELECT tblBuffer.InvoiceNum, tblBuffer.InvoiceDate, tblBuffer.Customer, tblBuffer.ShipDate, tblBuffer.Quantity, tblBuffer.Item, tblBuffer.PriceEach
      FROM tblBuffer LEFT JOIN tblInvoices 
        ON tblBuffer.InvoiceNum = tblInvoices.InvoiceNum
      WHERE tblInvoices.InvoiceNum Is Null
  • Теперь мне приходит в голову, учитывая имена полей, которыепричина, по которой много дублирующих счетов-фактур, заключается в том, что это денормализованные данные, а случаи, когда существует более одной записи, - это фактически любой счет-фактура с более чем одним элементом счета-фактуры.В этом случае вам может потребоваться создать таблицу заголовков счетов-фактур, а затем вставить элементы счета-фактуры в таблицу сведений о счете-фактуре.Я оставлю это в качестве упражнения для читателя, так как это слишком много работы, чтобы макетировать его в абстрактном, когда это может даже не иметь значения.
0 голосов
/ 21 июля 2011

Исправьте это в корне.

Основной причиной проблемы является то, что какой-либо человек или программное обеспечение создает электронную таблицу Excel с дублирующимися строками. Лучшее, что вы можете сделать, - это удалить дубликаты до того, как данные попадут в Excel.

Если вы не можете этого сделать, удалите дубликаты в Excel, прежде чем импортировать их в Access. (Вам не нужно писать макрос для этого.) Поскольку тогда у вас будет нет дубликатов, вы сможете установить ключ для целевой таблицы. В лучшем случае ваш ключ - InvoiceNum. В худшем случае ключом будет {InvoiceNum, InvoiceDate, Customer, ShipDate, Количество, Item, PriceEach}.

Все это предполагает, что дубликаты не имеют смысла. Если они (должны быть) значимыми, тогда вам нужно больше столбцов. Я не могу себе представить, как это может произойти.

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