2010-05-14 7 views
1

J'ai une base de données Access qui a deux tables qui sont liées par PK/FK. Malheureusement, les tables de base de données ont permis des enregistrements dupliqués/redondants et ont rendu la base de données un peu compliquée. J'essaie de comprendre une instruction SQL qui va résoudre le problème.Requête UPDATE qui corrige des enregistrements orphelins

Pour mieux expliquer le problème et l'objectif, je l'ai créé des tables par exemple à utiliser comme référence: alt text http://img38.imageshack.us/img38/9243/514201074110am.png Vous remarquerez qu'il ya deux tables, une table d'étudiants et une table de TestScore où StudentID est le PK/FK.

La table Étudiant contient des enregistrements en double pour les étudiants John, Sally, Tommy et Suzy. En d'autres termes, les John's avec StudentID 1 et 5 sont la même personne, Sally 2 et 6 sont la même personne, et ainsi de suite.

La table TestScore met en relation les résultats des tests avec un étudiant. Ignorer comment/pourquoi la table des étudiants a permis les doublons, etc - Le but que j'essaye d'accomplir est de mettre à jour la table TestScore afin qu'elle remplace les StudentID qui ont été désactivés avec le StudentID activé correspondant. Donc, tous les StudentID = 1 (John) seront mis à jour à 5; tous les StudentID = 2 (Sally) seront mis à jour à 6, et ainsi de suite. Voici la table TestScore résultante pour laquelle je suis en train de tourner (Notez qu'il n'y a plus de référence aux StudentID 1-4 désactivés): alt text http://img163.imageshack.us/img163/1954/514201091121am.png Pouvez-vous penser à une requête (compatible avec le moteur JET de MS Access) qui peut atteindre cet objectif? ? Ou, peut-être, vous pouvez offrir quelques conseils/perspectives qui me dirigeront dans la bonne direction.

Merci.

+1

Vouliez-vous afficher des structures de table?Comment identifiez-vous les doublons, est-ce un processus manuel ou y a-t-il une autre table contenant SEULEMENT des doublons, ou utilisez-vous simplement des étudiants avec le même nom et espérez qu'il n'y a pas que deux personnes qui partagent un nom? – brydgesk

+0

Oui, j'ai posté les structures dans une image ref. Apparemment, vous ne voyez pas les images - Voici les liens directs vers les images de mes exemples de structure de table: http://img38.imageshack.us/img38/9243/514201074110am.png http: //img163.imageshack .us/img163/1954/514201091121am.png Dans mon exemple, j'identifie simplement des dupes par le champ Nom. Mais dans ma base de données actuelle, il s'agit d'un numéro de série du produit. – Jed

Répondre

1

Le Le seul moyen de le faire est de passer par une série de requêtes et de tables temporaires. D'abord, je créerais la requête Make Table suivante que vous utiliseriez pour créer un mappage du mauvais StudentID pour corriger 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 

Ensuite, vous pouvez utiliser cette table temporaire pour mettre à jour la table TestScore avec le StudentID correct.

Update TestScore 
    Inner Join zzStudentMap 
     On zzStudentMap.OldStudentId = TestScore.StudentId 
Set StudentId = zzStudentMap.NewStudentId 
+0

Je n'ai pas pensé à utiliser une table temporaire. Merci, Thomas. – Jed

1

La technique la plus courante pour identifier les doublons dans une table est de regrouper les champs qui représentent les doublons:

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

Dans ce cas, nous voulons supprimer l'un des Brian Smith Records, ou dans votre cas , mettez à jour le champ ID de manière à ce qu'ils aient tous les deux la valeur 25 ou 1 (complètement arbitraire lequel utiliser).

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

En utilisant min sur ID retournera:

ID FIRST_NAME LAST_NAME 
1 Brian Smith 
3 George Smith 

Si vous utilisez max vous obtiendrez

ID FIRST_NAME LAST_NAME 
25 Brian Smith 
3 George Smith 

Je l'habitude d'utiliser cette technique pour supprimer les doublons, ne pas les mettre à jour:

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

Merci, Brian. C'est une méthode cool pour supprimer des doublons. Cependant, bien que je sois d'accord pour supprimer des doublons de mon exemple de table Étudiant, il est obligatoire que je sauvegarde (mise à jour) les enregistrements existants dans la table TestScore. En revenant à l'exemple de table TestScore, vous remarquerez qu'il existe des enregistrements pour John (ID = 1) et John (ID = 5). Le problème est, John ID1 et ID5 sont la même personne. Donc, je veux mettre à jour tous les ID = 1 à ID = 5. Je ne veux pas perdre de vue l'historique de tous les résultats des tests de John (et des autres étudiants). – Jed

Questions connexes