Запрос доступа дублирует уникальные записи/проблемы со связанной таблицей

Я надеюсь, что кто-то может помочь мне с этим:

У меня есть простой запрос, объединяющий список имен и основных сведений с другой таблицей, содержащей более конкретную информацию. Некоторые имена обязательно будут появляться более одного раза, и произвольные различия, такие как «Джон Смит 1» и «Джон Смит 2», недопустимы, поэтому я использовал автонумерацию, чтобы записи отличались друг от друга.

Проблема в том, что мой запрос создает две записи для каждого имени, которое появляется более одного раза. Например, есть два клиента с именем «Sophoan», каждый с другим идентификационным номером, и запрос подобрался к каждому из них дважды, что привело к четырем записям (всего имеется 122 записи, а должно быть только 102). «Уникальные значения» установлены на «да».

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

Что мне не хватает? Или запрос - неправильный подход, и мне нужно найти другой способ объединить мои таблицы?

Проект в деталях: я создаю базу данных для благотворительной организации, которая занимается двумя основными видами деятельности: социальной работой и обучением. База данных предназначена для записи информации об их клиентах и ​​результатах их взаимодействия с клиентами (проблемы, с которыми они обращались за помощью, результаты обучающих семинаров и т. д.). Некоторые клиенты будут переходить между действиями, которые организация хочет отслеживать, поэтому все зарегистрированные клиенты попадают в один список, а отдельные таблицы включают его для сбора данных для каждого конкретного действия, в котором участвует клиент. Этот запрос должен быть моим решением для объединение этих таблиц для ввода данных пользователем.

На данный момент у меня есть следующие таблицы:

  • AllList (основной список имен клиентов и основная контактная информация; «Реестр социальной работы» и «Регистр участников» присоединяются к этой таблице по «Имени»)
  • Реестр социальной работы (список клиентов социальной работы с полной информацией о каждом случае)
  • Таблица последующих действий социальной работы (используется, когда сотрудники звонят клиентам социальной работы, чтобы узнать, как продвигается их проблема; в реестре слишком много столбцов для этого; присоединяются к реестру по «Имени клиента»)
  • Регистрация участников (список клиентов для обучения и подробная информация о том, какие семинары они посетили и почему они отсутствовали, если пропустили занятие)
  • Индивидуальные таблицы семинаров x14 (каждый семинар включает в себя тест, и в этих таблицах записываются ответы клиентов и их баллы по каждому отдельному тесту; когда база данных будет завершена, их будет более 20; Имя')

Запросы:

  • Запрос обзора участников (связывает данные о посещаемости из «Регистра» с данными об оценках по каждому семинару, чтобы представить обзор только для чтения; этот, кажется, работает отлично)
  • Запрос Social Work (нефункциональный; предназначен для связывания «Регистра клиентов» с «Всем списком» для ввода данных, чтобы при регистрации нового клиента
    он создавал новую запись в обеих таблицах с записями
    совпало)
  • Запрос участника (еще не предпринимался; как указано выше, предназначен для привязки «Регистра участника» к «Всему списку» для ввода данных)

НО Я понял, что запросы нельзя использовать для ввода данных, поэтому этот подход кажется тупиковым. У меня был некоторый успех в использовании подчиненных форм для ввода данных, но я не уверен, что это лучший способ.

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

[Примечание. Есть и другие таблицы, в которых хранится вторичная информация, но они не имеют отношения к проблеме, поскольку они не связаны и не будут связаны с какими-либо другими таблицами.]


person Andrew Crawford    schedule 27.11.2014    source источник
comment
Эндрю, вам нужно предоставить схему для ваших таблиц и запрос, который вы пробовали. Было бы также полезно, если бы вы могли показать некоторые данные в каждой таблице и ожидаемый результат.   -  person Renaud Bompuis    schedule 28.11.2014
comment
Я попытался опубликовать несколько скриншотов, но, поскольку я зарегистрировался только для того, чтобы задать этот вопрос, похоже, у меня еще нет разрешения. Тем временем я отредактирую свой пост, чтобы включить схему как можно подробнее.   -  person Andrew Crawford    schedule 28.11.2014


Ответы (1)


Я понял, что запросы нельзя использовать для ввода данных

На самом деле, несложные запросы можно редактировать, пока таблица, данные которой вы хотите изменить, остается «основой» запроса. Access применяет ряд факторов, чтобы определить, редактируется запрос или нет.
В большинстве случаев довольно легко понять, почему запрос стал недоступным для редактирования.
Задайте себе вопрос: если я редактирую эти данные, как Access будет гарантировать, что именно эти данные будут обновлены без двусмысленности?

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

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

Это замечание на самом деле доказывает, что у вас есть проблемы с дизайном вашей базы данных.

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

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

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

Лучший способ обеспечить уникальность записей в таблице — использовать поле AutoNumber ID по умолчанию, предложенное Access при создании новой таблицы. Это называется Суррогатный ключ.
Его нельзя редактировать, изменять или даже показывать пользователю. Его единственная цель — сделать первичный ключ таблицы уникальным и неизменяемым с течением времени, чтобы его можно было надежно использовать в качестве способа ссылки на запись из одной таблицы в другую (если таблица должна ссылаться на конкретную запись, она будет содержать поле, которое будет содержать этот ID. Это поле называется Внешний ключ).

Имена, которые у вас есть для ваших таблиц, недостаточно точны: думайте о каждой таблице как о сущности, содержащей связанные данные.
Тот факт, что у вас есть таблица с именем AllList, означает, что ее назначение не в этом. хорошо продуманный; это звучит как всеобъемлющее, а не как тщательно продуманная сущность.
Вместо этого, если это ваш список клиентов, просто назовите его Client. Каждая запись в этой таблице содержит информацию для одного клиента (использовать множественное или единственное число зависит от вас, просто придерживайтесь своего выбора, чрезвычайно важно быть последовательным).
Вместо использования имени клиента в качестве ключа , создайте поле ID, автонумерацию и установите его как первичный ключ.

Давайте также переименуем «Реестр социальной работы», в котором хранятся дела Клиента, просто как ClientCase. Эта взаимосвязь кажется очевидной из вашего описания таблицы, но неясна в самом имени таблицы (кстати, я знаю, что Access допускает пробелы в именах таблиц и полей, но это очень плохая идея использовать их, если вы заботитесь хотя бы о немного о будущем вашей работы).

При этом создайте числовое поле ClientID (внешний ключ), которое будет содержать ID соответствующего клиента в таблице ClientCase.

Вы не говорите об отношениях между Клиентом и его Делами. Это еще одна область, где вы должны быть ясны: сколько дел может иметь один клиент?

  • Не более 1 случая? (0 или 1 случай)
  • ровно 1 случай?
  • хоть один кейс? (1 или более дел)
  • любое количество случаев? (0 или более дел)

Знание этого важно для выбора правильного типа JOIN в ваших запросах. Это важная часть предположений о дизайне при создании базы данных.

Например, в самом общем случае, предполагая, что у клиента может быть 0 или более обращений, у вас может быть отчет, отображающий имя клиента и количество связанных с ним обращений, например:

SELECT Client.Name,
       Count(ClientCase.ID) AS CountOfCases
FROM Client
  LEFT JOIN ClientCase
     ON Client.ID = ClienCase.ClientID
GROUP BY Client.Name

Вы немного подробнее описали свой базовый дизайн, но этого недостаточно. Покажите нам фактические структуры таблиц и SQL запросов, которые вы пробовали. Из описания, которое вы даете, трудно понять фактические детали дизайна и сказать вам, почему он терпит неудачу и как заставить его работать.

person Renaud Bompuis    schedule 29.11.2014
comment
Спасибо за ваш добрый и подробный ответ. Я начну применять это на практике и посмотрю, как у меня все получится (учиться на практике — моя мантра для всего этого проекта). Начиная с внешнего ключа. У каждого клиента будет от 0 до 1 обращения, а дополнительные сведения о деле будут добавлены позже в таблицу «Последующие действия». Я предполагаю, что могу настроить это так, чтобы и «Дело», и «Последующие действия» могли ссылаться на «Клиента» и оба могли редактироваться в одной форме? Я не уверен, что вам нужно увидеть для структур таблиц? SQL-запрос я опубликую позже, когда заново создам запросы, используя новый подход к связыванию. - person Andrew Crawford; 02.12.2014