1

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

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

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

TestScore 表将测试分数与学生相关联。

忽略 Student 表允许重复的方式/原因等 - 我要完成的目标是更新 TestScore 表,以便它用相应的启用 StudentID 替换已禁用的 StudentID。因此,所有 StudentID's = 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 引擎兼容)?或者,也许,您可以提供一些提示/观点,为我指明正确的方向。

谢谢。

4

2 回答 2

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

在 ID 上使用 min 将返回:

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)
于 2010-05-14T16:55:36.160 回答
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
于 2010-05-14T17:03:58.413 回答