Сведения о вопросе

Junior

21:55, 26th August, 2020

Теги

sql   ms-access    

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

Просмотров: 435   Ответов: 7

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

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



  Сведения об ответе

park

00:28, 12th August, 2020

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

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


  Сведения об ответе

COOL

21:03, 24th August, 2020

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

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

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


  Сведения об ответе

JUST___

12:13, 12th August, 2020

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

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


  Сведения об ответе

#hash

09:56, 11th August, 2020

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


  Сведения об ответе

qwerty101

22:04, 20th August, 2020

Есть ли поле 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

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

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


  Сведения об ответе

appple

17:54, 11th August, 2020

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

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

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

"DB name не удалось добавить все данные в таблицу.

"Содержимое полей в 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=Yes на HDR=No


  Сведения об ответе

прога

14:38, 17th August, 2020

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

Выпьем за вашу помощь.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться