문제

17 개의 다른 테이블로 만들어진 ~ 4000 레코드의 액세스 2003 테이블이 있습니다. 이 레코드의 약 절반은 복제입니다. 고유 한 식별 열 (ID, 이름 등)은 없습니다. 테이블이 결합되었을 때 자동으로 채워진 ID 열이 있습니다. 의미는 복제가 완전히 동일하지 않다는 의미입니다 (이 열은 더 쉬워지면이 열을 제거 할 수 있습니다).

Access Find Duplicates Quizard를 사용하여 복제 된 레코드 목록을 제공하지만 삭제할 수는 없습니다 (삭제할 수없는 경우이 쿼리는 무엇입니까?). 생성 된 쿼리를 제거 쿼리로 변환하려고 시도했지만 찾은 행 수를 변경했습니다. 나는 SQL을 손으로 바꾸지 만 조금 너머로 7 줄 길이입니다.

중복을 제거하는 좋은 방법을 아는 사람이 있습니까?

도움이 되었습니까?

해결책

쿼리를 찾을 수없는 이유는 레코드를 삭제할 수없는 이유는 기본적으로 집계 쿼리이기 때문에 찾은 복제 수를 계산하고 카운트가 1보다 큰 경우를 반환하는 것입니다.

중복을 기반으로 삭제 쿼리를 만들면 중복 값이있는 모든 행을 삭제하면 원하는 것이 아닐 수도 있습니다. 중복 중 하나를 제외한 모든 것을 삭제하려고합니다.

비교에서 ID 열을 제외하고 한 것 외에 레코드의 모든 복제물을 삭제해야합니다. 나는 이것을하는 가장 간단한 방법은 고유 한 가치 (MyTable에서 Select Field1, Field2 ...) 대신 모든 필드에 대해 대신 제외하고 ID 필드의 경우 결과를 사용하여 약 2000 레코드의 새 테이블을 작성합니다 (절반이 복제 된 경우).

그런 다음 새 테이블에서 ID 열을 작성하고 업데이트 쿼리를 사용 하여이 ID를 원래 테이블의 첫 번째 일치 ID로 업데이트하십시오 (이를 사용하여 수행 할 수 있습니다. dlookup, 도메인에서 기준이 true 인 첫 번째 표현식 값을 반환합니다.).

dlookup () 함수는 하나 이상의 레코드가 기준을 만족하더라도 단일 필드에서 하나의 값을 반환합니다. 레코드가 기준을 충족하지 않거나 도메인에 레코드가 포함되어 있지 않은 경우 dlookup ()는 널을 반환합니다.

고유 한 값인 다른 모든 필드를 기반으로 첫 번째 일치 ID를 식별하기 때문에 타의 추종을 불허하는 ID는 복제에 속합니다. 고유 한 필드 세트가 주어진 첫 번째 일치 키를 식별하여 PK 관계를 되돌릴 것입니다. 그런 다음 ID를 PK로 설정해야합니다. 물론 이것은 ID가 고유 한 의미가 없다고 가정하며, 다른 복제 행에 속하는 ID에 주어진 복제 행에 대해 하나의 특정 ID를 유지하는 것에 신경 쓰지 않습니다. 이것은 당신이 ID 열의 데이터에 관심이 있다고 가정하므로 남은 모든 행에 대해 보존하려고합니다. 그렇지 않으면 dlookup 단계를 무시하고 ID와는 별개의 모든 열에서 선택을 선택하십시오.

다른 팁

ID 열을 제외한 모든 열에서 선택을 사용하십시오.

SELECT DISTINCTROW Column1, Column2, Column3 
INTO MYNEWTABLE
FROM TABLE

단순히 이름을 교환 할 수 있습니다.

이 솔루션은 중복이없는 새 테이블을 제공합니다.

다음은 원본 ID를 보존하고 한 단계로 수행합니다.

DELETE FROM table_with_duplicates 
WHERE table_with_duplicates.id NOT IN 
    (SELECT max(id) 
    FROM table_with_duplicates 
    GROUP BY duplicated_field_1, duplicated_field_2, ...
    )

이제 복제 및 보존 ID가없는 원래 테이블이 있습니다. 그리고 큰 삭제를 시도하기 전에 항상 데이터를 백업하는 것을 잊지 마십시오.

DELETE * FROM table_with_duplicates
WHERE table_with_duplicates.ID In 
    (SELECT max(ID) 
     FROM table_with_duplicates 
     GROUP BY [duplicated_field_1] 
     HAVING Count(*)>1
    )

실제로 나는 매우 간단한 솔루션을 찾았지만 시간이 걸렸지 만 모든 필드는 완전한 중복 레코드와 동일하며 모든 필드마다 하나의 쿼리를 만들고 "Group By"를 분류합니다. 따라서 복제물이 결합 되며이 정보를 새 테이블에 추가하고 기존 테이블과 동일하게 바꿀 수 있습니다. 기본 키 필드가있는 경우 쿼리에서 무시하면 데이터가 결합됩니다 (기본 필드의 데이터에 관심이 없다고 가정). 이 솔루션이 5 시간이 걸렸는 이유를 아무도 모른다. 생각해냅니다. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top