ОБНОВЛЕНИЕ запроса, который исправляет потерянные записи - PullRequest
1 голос
/ 14 мая 2010

У меня есть база данных Access, в которой есть две таблицы, связанные с PK / FK. К сожалению, таблицы базы данных допускают дублирование / избыточность записей и делают базу данных немного странной. Я пытаюсь выяснить оператор SQL, который решит проблему.

Чтобы лучше объяснить проблему и цель, я создал примеры таблиц для использования в качестве ссылки: альтернативный текст http://img38.imageshack.us/img38/9243/514201074110am.png Вы заметите, что есть две таблицы: таблица Student и таблица TestScore, где StudentID - это PK / FK.

Таблица учеников содержит дубликаты записей для учеников Джона, Салли, Томми и Сьюзи. Другими словами, «Джон» со студентами 1 и 5 - это одно и то же лицо, Салли 2 и 6 - это одно и то же лицо и т. Д.

Таблица TestScore связывает результаты тестов со студентом.

Игнорирование того, как / почему таблица Student допускает дублирование и т. Д. Цель, которую я пытаюсь достичь, - обновить таблицу TestScore, чтобы она заменяла отключенные идентификаторы StudentID соответствующими активированными StudentID. Таким образом, все StudentID's = 1 (Джон) будут обновлены до 5; все StudentID's = 2 (Sally) будут обновлены до 6 и так далее. Вот итоговая таблица TestScore, для которой я снимаю (обратите внимание, что больше нет ссылок на отключенные StudentID's 1-4): альтернативный текст http://img163.imageshack.us/img163/1954/514201091121am.png Можете ли вы придумать запрос (совместимый с JET Engine MS Access), который может достичь этой цели? Или, может быть, вы можете предложить несколько советов / перспектив, которые укажут мне правильное направление.

Спасибо.

Ответы [ 2 ]

1 голос
/ 14 мая 2010

Единственный способ сделать это - выполнить серию запросов и временных таблиц.

Сначала я бы создал следующий запрос Make Table, который вы бы использовали для создания сопоставления неверного StudentID для исправления StudentID.

Select S1.StudentId As NewStudentId, S2.StudentId As OldStudentId 
Into zzStudentMap
From Student As S1
    Inner Join Student As S2
        On S2.Name = S1.Name
Where S1.Disabled = False
    And S2.StudentId <> S1.StudentId
    And S2.Disabled = True

Далее, вы будете использовать эту временную таблицу для обновления таблицы TestScore, указав правильный StudentID.

Update TestScore
    Inner Join zzStudentMap
        On zzStudentMap.OldStudentId = TestScore.StudentId
Set StudentId = zzStudentMap.NewStudentId
1 голос
/ 14 мая 2010

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

ID  FIRST_NAME  LAST_NAME
1   Brian   Smith
3   George  Smith
25  Brian   Smith

В этом случае мы хотим удалить одну из записей Брайана Смита или, в вашем случае, обновить поле идентификатора, чтобы они оба имели значение 25 или 1 (совершенно произвольно, какой использовать).

SELECT  min(id)
    FROM example
GROUP BY first_name, last_name

Использование min для идентификатора вернет:

ID  FIRST_NAME  LAST_NAME
1   Brian   Smith
3   George  Smith

Если вы используете макс, вы получите

ID  FIRST_NAME  LAST_NAME
25  Brian   Smith
3   George  Smith

Обычно я использую эту технику, чтобы удалять дубликаты, а не обновлять их:

DELETE FROM example
      WHERE ID NOT IN (SELECT   MAX (ID)
                           FROM example
                       GROUP BY first_name, last_name)
...