Как фильтровать по 2 полям при загрузке данных в таблицу базы данных доступа из таблицы Excel

Хорошо, вот моя проблема, не будучи слишком конкретной по причинам увольнения за размещение практики компании в Интернете.

Есть электронные таблицы. Они загружены в базу данных. Мне нужно отфильтровать дубликаты из загрузки. Единственный способ сделать это - убедиться, что для каждой записи два поля не совпадают с записями в базе данных. Поскольку только одно поле является одинаковым, это не означает, что оно является дубликатом. Есть два специальных поля, позволяющих называть их FLDA и FLDB, которые должны совпадать с уже имеющейся записью в базе данных. Я могу фильтровать уже по одному полю. Я думаю, что это должен быть подзапрос, но я не уверен, как его применить. Это трудно описать. Просто спросите, если вы не уверены, что я имею в виду.

22.08.2008 15:44:39
7 ОТВЕТОВ

У меня была похожая проблема. Мое решение было:

  1. импортировать в промежуточный стол
  2. удалить дубликаты
  3. скопируйте то, что осталось в живую таблицу

Это немного BFI, но это просто работает.

1
22.08.2008 16:17:52

Как вы загружаете их в базу данных? Это с вашим собственным кодом для чтения файлов Excel? Вы можете читать файлы Excel, используя ADO / ADO.NET с правильной строкой подключения . Тогда вы могли бы прочитать данные с помощью запроса, который отсеял бы обманщиков.

0
23.05.2017 12:13:34

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

Другим подходом было бы установить идентичность на FLDA и FLDB. Это предотвратит попадание дубликатов в таблицу. Конечно, вам также нужно перехватить исключение, которое выдается при сбое операции вставки.

0
23.08.2008 21:33:32

Подойдет ли запрос? Например:

INSERT INTO ToUpdate ( Field1, Field2 )
SELECT e.H1, e.H2
FROM (SELECT * FROM [Sheet1$] IN '' [Excel 8.0;HDR=YES;IMEX=1;database=C:\Docs\LTD.xls]) As e
LEFT JOIN ToUpdate ON (e.H2 = ToUpdate.Field2) AND (e.H1 = ToUpdate.Field1)
WHERE ToUpdate.Field1 Is Null AND ToUpdate.Field2 Is Null
1
23.08.2008 22:34:33

Есть ли поле FLDC, которое будет отличаться для идентификации дубликатов? Я предполагаю, что должно быть, так как в противном случае наличие (FLDA, FLDB) в качестве уникального или первичного ключа решит вашу проблему немедленно.

Предполагая, что есть такое поле, вы можете попробовать что-то вроде этого:

SELECT T1.FLDA, T1.FLDB, T1.FLDC
FROM Table1 T1, Table1 T2
WHERE T1.FLDA = T2.FLDA
  AND T1.FLDB = T2.FLDB
  AND T1.FLDC <> T2.FLDC

Недостатком является то, что и оригинал, и дубликат будут возвращены чем-то вроде этого. Если вы хотите видеть только дубликаты, вам, вероятно, придется найти способ идентифицировать «исходную» строку и добавить для этого еще одно предложение WHERE.

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

0
25.08.2008 14:23:49

Чтобы избежать дубликатов при импорте:

1 - Если на столе еще нет первичного ключа, поместите один на FLDA и FLDB (вместе). Если уже есть первичный ключ, который не является FLDA и FLDB (вместе), поместите индекс в таблицу для этих двух полей, уникальное yes, игнорируйте нулевые значения no.

2 - Вы можете импортировать из таблицы в таблицу с помощью мастера или с помощью запроса. Если вы сделаете это с помощью мастера импорта электронных таблиц, вы увидите это сообщение до начала импорта:

Msgstr "Имя БД не смогло добавить все данные в таблицу.

«Содержимое полей в 0 записях было удалено, и (xx) записи были потеряны из-за нарушения ключа. (Эти потерянные записи были дубликатами, поэтому никаких реальных потерь там нет.) ... Вы все равно хотите продолжить?»

Нажмите «Да», чтобы импортировать строки из электронной таблицы. Дубликаты не будут импортированы.

Или, чтобы использовать запрос для импорта, вставьте его в новый запрос в виде sql (меню: Вставка> Запрос> Вид дизайна, кнопка Закрыть; меню: Вид> Вид SQL.)

INSERT INTO tblInput
  SELECT XLS.* 
  FROM tblInput AS T RIGHT JOIN
    [Excel 8.0;IMEX=1;HDR=Yes;DATABASE=c:\data.xls;].[Sheet1$] AS XLS 
    ON T.FLDA = XLS.FLDA AND T.FLDB = XLS.FLDB
  WHERE ISNULL(T.FLDA) AND ISNULL(T.FLDB);

Измените путь, c: \ data.xls, на свой путь, Sheet1 $ на свое имя листа, tblInput на имя таблицы, а FLDA и FLDB на имена столбцов. Если в таблице нет заголовков (имен столбцов), измените HDR = Да на HDR = Нет

0
16.09.2008 07:51:07

Я сделал это с помощью запроса на удаление, а затем с помощью Select from Table 1 Group by X Having Y, Z, A. И тогда я поставил кнопку запуска запроса для пользователей переднего плана.

Приветствую за вашу помощь.

0
28.04.2016 06:35:23