Создайте новую таблицу поиска, где данные уже существуют

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

Есть ли способ в Access 2013 создать такой поиск без потери данных?

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

http://access.mvps.org/access/lookupfields.htm

Ниже пример моих данных. Мне нужно извлечь 2-е и 3-е поля в другие таблицы. Если я могу сделать это с ними, я могу сделать это и с другими.

введите здесь описание изображения

В настоящее время это хранится в виде текста в полях. Я хотел бы удалить их и заменить идентификаторами FK.


person Francis Rodgers    schedule 28.10.2013    source источник
comment
Вам действительно нужна справочная колонка? Как вы планируете его использовать? Во многих случаях эффективнее написать запрос самостоятельно.   -  person Linger    schedule 28.10.2013
comment
Это не совсем о функциях поиска. Речь идет о процессе нормализации. Слишком много повторяющихся данных, которые можно разделить на другие таблицы и связать обратно. Если я смогу это сделать, я буду счастлив. Возможность поиска — бонус, который мне не нужен.   -  person Francis Rodgers    schedule 28.10.2013
comment
Можете ли вы привести пример части таблицы, которую необходимо нормализовать?   -  person Linger    schedule 28.10.2013
comment
Обновлено, чтобы включить образец изображения.   -  person Francis Rodgers    schedule 28.10.2013


Ответы (1)


Вы можете создать свою вторую таблицу и добавить данные в таблицу. Затем обновите первую таблицу, чтобы записи соответствовали друг другу.

Допустим, у вас есть следующая таблица:

CustOrders
ID       Customer     DateOrdered
123      K-Mart       01/01/2013
124      K Mart       01/05/2013
125      Walmart      02/05/2013
126      Walmart      03/07/2013
127      Miejers      03/11/2013
128      K-Mart       03/12/2013

Вы можете узнать все Customers, находящиеся в таблице CustOrders, выполнив следующие действия:

SELECT DISTINCT Customer From CustOrders

Затем создайте запись в следующей таблице для каждого:

Customers
ID       Customer
1        K-Mart
2        Walmart
3        Miejers

Затем вы можете обновить таблицу CustOrders, выполнив следующие действия:

UPDATE CustOrders SET Customer = 1 WHERE Customer = 'K-Mart' OR Customer = 'K Mart'

Конечно, вам придется сделать это для каждого конкретного клиента, который у вас есть.

Затем, если вы хотите, вы можете изменить тип данных поля Customer в таблице CustOrders на Long Integer.

Наконец, я бы создал поле со списком в любой форме ввода/редактирования со следующим RowSource:

SELECT ID, Customer FROM Customers ORDER BY Customer

Установите поле со списком для ограничения из списка и привязки к столбцу 1.

person Linger    schedule 28.10.2013
comment
Я уже напечатал большую часть своего ответа до того, как вы опубликовали обновление на свой вопрос. Если вам нужны дополнительные разъяснения, дайте мне знать. - person Linger; 28.10.2013
comment
Я собираюсь попробовать. Спасибо, и если это сработает, я приму это как ответ. Спасибо еще раз. - person Francis Rodgers; 28.10.2013
comment
Добро пожаловать, FYI, я всегда рекомендую не использовать поля поиска доступа, когда это возможно. Его достаточно легко выполнить самостоятельно. - person Linger; 28.10.2013
comment
Это хороший ответ и спасибо, однако есть проблема. Я достаточно хорошо знаю базы данных. Обычно я работаю с SQL Server, давно не работал с доступом. Проблема на самом деле заключается в способности делать это эффективно. Я мог бы выполнить вышеуказанный запрос и шаги слишком легко (и сделал), проблема в том, что у меня около 40 различных полей во втором столбце и более 100 в третьем. Невозможно написать отдельные запросы на обновление для всех из них. Есть ли способ сделать какую-то перекрестную проверку, которая будет создавать таблицы, искать совпадения и делать обновления по мере необходимости. - person Francis Rodgers; 28.10.2013
comment
Да, но если поля представляют собой текстовые поля, которые позволяют пользователю помещать в них все, что они хотят, вы можете получить мусор в новой таблице. Как и в моем примере, K-Mart написан с ошибкой в ​​одной из записей. - person Linger; 28.10.2013
comment
На стороне пользователя они видят раскрывающийся список, поэтому их выбор ограничен. В результате введенные данные, хотя и сохраняются в виде текста, всегда идентичны. Если бы были какие-то проблемные данные, они были бы очень редкими, и я мог бы обрабатывать их по записи. В настоящее время мне нужно просмотреть около 5000 записей, и я уверен, что ошибки будут менее чем в 1% из них. Вручную обрабатывать намного проще! - person Francis Rodgers; 28.10.2013
comment
INSERT INTO Customers (Customer) SELECT DISTINCT Customer FROM CustOrders будет примером, связанным с моим ответом. - person Linger; 28.10.2013
comment
Я пробовал разные варианты этого, но не имел большого успеха. Я нашел способ добраться туда, и я сделал это благодаря вашей помощи. Еще раз спасибо за ваше время. - person Francis Rodgers; 28.10.2013
comment
Как насчет: INSERT INTO Customers SELECT DISTINCT CustOrders.Customer FROM CustOrders. Предполагается, что ID задано как поле с автонумерацией. - person Linger; 28.10.2013
comment
Я сделал запрос на создание таблицы, используя вашу команду выбора отдельной. Затем я зашел в таблицу и задал ее свойства (ПК). Поскольку существует только одно поле (я не создавал поле с нумерованным идентификатором), я смог вернуться к основной таблице, использовать мастер поиска и точно связать таблицы. Это сработало. Поэтому я повторил процесс и до сих пор не получил никаких ошибок. Такими темпами я закончу перед сном. :) - person Francis Rodgers; 28.10.2013