2010-05-14 57 views
1

我有一個Access數據庫有兩個由PK/FK相關的表。不幸的是,數據庫表允許重複/冗餘記錄,並使數據庫有點棘手。我正在試圖找出一個可以解決問題的SQL語句。修復孤立記錄的更新查詢

爲了更好地說明問題和目標,我創建的示例表作爲參考使用: alt text http://img38.imageshack.us/img38/9243/514201074110am.png 你會發現有兩個表,一個學生表和TestScore表,其中StudentID是PK/FK。

學生表包含學生John,Sally,Tommy和Suzy的重複記錄。換句話說,帶有StudentID的1和5的John是同一個人,Sally 2和6是同一個人,等等。

TestScore表將考試成績與學生相關聯。

忽略學生表如何/爲什麼允許重複等 - 我試圖完成的目標是更新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引擎兼容)嗎? ?或者,也許你可以提供一些提示/觀點,這些提示/觀點將指向我正確的方向。

謝謝。

+1

您的意思是發佈表結構嗎?你如何識別重複,是一個手動過程,還是有另一個表只包含重複項,或者你是否只是使用同名學生,希望不只有兩個人真正分享一個名字? – brydgesk 2010-05-14 16:46:38

+0

是的,我發佈了一個圖像參考結構。顯然,你沒有看到圖像 - 下面是我的示例表結構的圖像的直接鏈接: http://img38.imageshack.us/img38/9243/514201074110am.png http://img163.imageshack .us/img163/1954/514201091121am.png 在我的示例中,我只是通過名稱字段標識dupe。但在我的實際數據庫中,它是由一個產品序列號。 – Jed 2010-05-14 17:22:42

回答

1

The唯一的方法就是通過一系列查詢和臨時表。

首先,我將創建以下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 
+0

我沒有想過要使用臨時表。謝謝,托馬斯。 – Jed 2010-05-14 18:24:57

1

最常用的技術來標識表中的重複是組由表示重複記錄的字段:

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

在這種情況下,我們要刪除的Brian Smith的唱片之一,或在您的情況,更新ID字段,使它們都具有25或1的值(完全隨意使用哪一個)。在ID

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

使用分鐘將返回:

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) 
+0

謝謝,Brian。這是刪除重複項的一種很酷的方法。 但是,雖然我可以在我的示例Student表中刪除重複項,但我必須保存(更新)TestScore表中的現有記錄。 回過頭來看一下TestScore表格,你會注意到有John(ID = 1)和John(ID = 5)的記錄。問題是,約翰ID1和ID5是同一個人。所以,我想更新所有的ID = 1到ID = 5。 我不想失去所有約翰(和其他學生)考試成績的歷史記錄。 – Jed 2010-05-14 17:15:16