1

PK/FK によって関連付けられた 2 つのテーブルを持つ Access データベースがあります。残念ながら、データベース テーブルでは重複/冗長なレコードが許可されており、データベースが少しおかしくなっています。問題を解決する SQL ステートメントを見つけようとしています。

問題と目標をよりよく説明するために、参照として使用するテーブルの例を作成しました: alt text http://img38.imageshack.us/img38/9243/514201074110am.png StudentID が PK/FK である TestScore テーブル。

Student テーブルには、生徒の John、Sally、Tommy、および Suzy の重複したレコードが含まれています。つまり、StudentID が 1 と 5 の John は同一人物であり、Sally 2 と 6 は同一人物であり、以下同様です。

TestScore テーブルは、テストのスコアを学生と関連付けます。

Student テーブルが重複を許可する方法/理由などを無視する - 私が達成しようとしている目標は、TestScore テーブルを更新して、無効になっている StudentID を対応する有効な StudentID に置き換えることです。したがって、すべての StudentID = 1 (John) は 5 に更新されます。すべての StudentID = 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 レコードの 1 つを削除するか、あなたのケースでは 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

これを行う唯一の方法は、一連のクエリと一時テーブルを使用することです。

最初に、不正な StudentID から正しい StudentID へのマッピングを作成するために使用する、次の Make Table クエリを作成します。

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

次に、その一時テーブルを使用して、TestScore テーブルを正しい StudentID で更新します。

Update TestScore
    Inner Join zzStudentMap
        On zzStudentMap.OldStudentId = TestScore.StudentId
Set StudentId = zzStudentMap.NewStudentId
于 2010-05-14T17:03:58.413 に答える