2010-05-14 4 views
1

PK/FK와 관련된 두 테이블이있는 Access 데이터베이스가 있습니다. 불행하게도, 데이터베이스 테이블은 중복/중복 레코드를 허용하고 데이터베이스를 약간 변형 시켰습니다. 문제를 해결할 SQL 문을 이해하려고합니다.고아 레코드를 수정하는 UPDATE 쿼리

더 문제 및 목표, 내가 참고 자료로 사용하는 예 테이블을 만들었을 설명하기 : alt text http://img38.imageshack.us/img38/9243/514201074110am.png 당신은 두 개의 테이블 학생 테이블과 StudentID는 PK/FK 인 TestScore 테이블이 있습니다 알 수 있습니다.

학생 테이블에는 John, Sally, Tommy 및 Suzy 학생의 중복 기록이 있습니다. 다시 말해, StudentID 1과 5를 가진 John은 같은 사람이고 Sally 2와 6은 같은 사람입니다.

TestScore 테이블은 테스트 점수와 학생을 관련시킵니다.

어떻게/왜 학생 테이블 중복 허용, 등 - 내가 달성하려는 목표는 TestScore 테이블을 업데이트하여 해당 사용 설정된 StudentID로 비활성화 된 StudentID를 대체하도록하는 것입니다. 따라서 모든 StudentID의 = 1 (John)은 5로 업데이트됩니다. 모든 StudentID의 = 2 (샐리)는 6으로 업데이트됩니다. 다음은 제가 촬영 한 결과 TestScore 테이블입니다 (사용하지 않는 StudentID의 1-4에 대한 참조가 더 이상 없음). alt text http://img163.imageshack.us/img163/1954/514201091121am.png 이 목표를 달성 할 수있는 쿼리 (MS Access의 JET 엔진과 호환 가능)를 생각해 볼 수 있습니까? ? 또는, 어쩌면, 당신은 정확한 방향으로 저를 가르 킬 것입니다 몇몇 끝 또는 원근법을 제안 할 수있다.

감사합니다. 우리가 브라이언 스미스 기록 중 하나, 또는 귀하의 경우를 제거 할이 경우

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

:

+1

테이블 구조를 게시 하시겠습니까?중복을 식별하는 방법, 수동으로 처리하는 방법 또는 중복 된 것을 포함하는 다른 테이블이 있습니까? 아니면 실제로 같은 이름의 학생을 사용하고 실제로 이름을 공유하는 두 명의 사람 만 있으면 안되기를 바랍니다. – brydgesk

+0

예, 구조를 이미지 ref에 게시했습니다. 분명히, 당신은 이미지를 볼 수 없습니다 - 여기 내 샘플 테이블 구조의 이미지에 대한 직접 링크가 있습니다 : http://img38.imageshack.us/img38/9243/514201074110am.png http : //img163.imageshack .us/img163/1954/514201091121am.png 예를 들어, 이름 필드로 중복을 식별하고 있습니다. 하지만 내 실제 데이터베이스에서 제품 일련 번호입니다. – Jed

답변

1

이 작업을 수행하는 유일한 방법은 일련의 쿼리와 임시 테이블을 사용하는 것입니다.

먼저 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 

그런 다음 임시 테이블을 사용하여 TestScore 테이블을 올바른 StudentID로 업데이트합니다.

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

임시 테이블을 사용하지 않을 생각입니다. 고마워, 토마스. – Jed

1

테이블에 중복을 식별하는 가장 일반적인 방법은 중복 레코드를 나타내는 필드로 그룹화하는 것 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

고마워, 브라이언. 중복을 삭제하는 멋진 방법입니다. 그러나 필자의 예제 Student 테이블에서 중복 된 레코드를 삭제해도 문제가 없지만 TestScore 테이블에 기존 레코드를 저장 (업데이트)해야합니다. 샘플 TestScore 테이블을 다시 보면 John (ID = 1) 및 John (ID = 5)에 대한 레코드가 있음을 알 수 있습니다. 문제는 John ID1과 ID5가 같은 사람이라는 것입니다. 그래서 모든 ID = 1에서 ID = 5로 업데이트하려고합니다. 존의 모든 (그리고 다른 학생들의) 시험 점수에 대한 기록을 잃고 싶지는 않습니다. – Jed