我有一个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引擎兼容)吗?或者,也许,你可以提供一些提示/观点,指出我正确的方向。
感谢。
答案 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