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

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

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

Ответы [ 7 ]

1 голос
/ 24 августа 2008

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

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 голос
/ 22 августа 2008

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

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

Это маленький BFI, но он просто работает.

0 голосов
/ 29 сентября 2008

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

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

0 голосов
/ 16 сентября 2008

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

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

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

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

"Содержимое полей в 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 голосов
/ 25 августа 2008

Есть ли поле 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 голосов
/ 24 августа 2008

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

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

0 голосов
/ 22 августа 2008

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

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