修复孤立记录的UPDATE查询

时间:2010-05-14 16:42:15

标签: sql ms-access duplicates sql-update orphan

我有一个Access数据库,它有两个与PK / FK相关的表。不幸的是,数据库表允许重复/冗余记录,并使数据库变得有点棘手。我试图找出一个可以解决问题的SQL语句。

为了更好地解释问题和目标,我创建了用作参考的示例表: alt text http://img38.imageshack.us/img38/9243/514201074110am.png 您会注意到有两个表,一个Student表和一个TestScore表,其中StudentID是PK / FK。

学生表包含John,Sally,Tommy和Suzy学生的重复记录。换句话说,学生ID为1和5的John是同一个人,Sally 2和6是同一个人,依此类推。

TestScore表将测试分数与学生联系起来。

忽略Student表允许重复的方式/原因等等 - 我要完成的目标是更新TestScore表,以便用相应的启用StudentID替换已禁用的StudentID。因此,所有StudentID = 1(John)将更新为5;所有StudentID's = 2(Sally)将更新为6,依此类推。这是我正在拍摄的结果TestScore表(请注意,不再有任何对禁用的StudentID 1-4的引用): alt text http://img163.imageshack.us/img163/1954/514201091121am.png 您能想到一个可以实现这一目标的查询(与MS Access的JET引擎兼容)吗?或者,也许,你可以提供一些提示/观点,指出我正确的方向。

感谢。

2 个答案:

答案 0 :(得分:1)

识别表中重复项的最常用技术是按表示重复记录的字段进行分组:

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

在这种情况下,我们要删除其中一个Brian Smith记录,或者在您的情况下,更新ID字段,使它们都具有25或1的值(完全任意使用哪一个)。

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

使用min on ID将返回:

ID  FIRST_NAME  LAST_NAME
1   Brian   Smith
3   George  Smith

如果你使用max,你会得到

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)

答案 1 :(得分:1)

执行此操作的唯一方法是通过一系列查询和临时表。

首先,我将创建以下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

接下来,您将使用该临时表来使用正确的StudentID更新TestScore表。

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