2017-11-05 3 views
1

미안하지만 당신에게 묻기는하지만 좋은 해결책이 떠오르는 것처럼 보일 수는 없지만 온라인에서 연구를 해봤지만이 제한된 경험으로 나는 내가 무엇인지 알아낼 수 없었습니다. 잘못하고있다. 나는 사본이 600000 개가 넘고 레코드에는 최대 ID 번호를 기반으로 제거 된 중복이 필요합니다. 왜냐하면 레코드에는 정확히 중복되지 않는 많은 다른 필드가 있기 때문에 계산하기가 힘듭니다. 도와주세요.액세스 최대 ID로 중복 레코드 제거

샘플 나는이 시도이

enter image description here

답변

2
DELETE 
FROM yourtable AS a 
WHERE a.id NOT IN 
(
SELECT Max(b.id) 
FROM yourtable AS b 
WHERE a.field1 = b.field1 
) 

하위 쿼리를 사용하면 field1의 각 값에 대한 최대 ID를 선택할 수 있습니다. delete 문은 id가 최대 id vale와 같지 않은 field1의 값마다 모든 레코드를 삭제합니다.

+0

네가 정말 잘 했어. 너의 테이블 뒤에있는 추론을 a와 yourtable로 이해하려고 노력 했어. 따라서 우리는 가상 테이블을 만들고 둘 다 비교하지만 중복이 아닌 최대를 비교하는 것입니다. –

+1

가상 테이블이 아니라 하위 쿼리가 포함 된 쿼리 (삭제 bla bla)입니다. 두 쿼리 모두 하나의 동일한 테이블을 참조합니다. 이제 하위 쿼리의 WHERE 절을 사용하여 한 테이블 내의 데이터를 비교하려는 경우 별칭을 사용해야합니다. 그렇지 않으면 동일한 테이블 내의 데이터를 비교할 수 없습니다. 나는 SELF JOINS를 읽을 것을 제안합니다. – Rene

0

처럼 볼 필요가

enter image description here

를 부착.

Delete from table where ID NOT IN 
(SELECT MAX(ID) FROM TABLE GROUP BY filed1, filed2, filed3 , sourcetable) 
+0

이 시도하고 당신이 0 레코드를 삭제하려고하고있어 중복 dupcombination2에서 * 삭제 , 삭제하지 않습니다 말한다 어디 ID NOT (필드 1에 의해 GROUP dupcombination2로부터 MAX (ID) 을 선택 FIELD2 IN , field3, sourcetable) –

1

그렇다면 FIELD1이 같고 ID가 큰 다른 행이 있으면 행이 삭제되어야한다는 것입니다. SQL로 번역 문장이된다 :

delete from my_table where (field1,id) not in 
(select field1, max(id) from my_table group by field1); 

아니에요 :

delete from my_table m where exists 
(select 1 from my_table where field1=m.field1 and id>m.id); 

또 다른 방법은 필드 1에서 각각의 고유 한 값에 대한 최대 (ID)와 사람 사이에없는 모든 행을 삭제하는 것입니다 둘 중 어느 것이 읽기 쉬운 지 확인하십시오.

+0

이 SQL에 대한 오류 메시지가 나타납니다 "기본 쿼리의 FROM 절에 EXISTS 예약어를 사용하지 않고 둘 이상의 필드를 반환 할 수있는 하위 쿼리를 작성했습니다" SQL : delete * dupcombination2 여기서 (field1, id)는 에 없습니다 (select field1, max (id) from dupcombination2 group by field1); –

+0

방금 ​​첫 번째 방법을 시도했지만 두 번째 방법은 시도하지 않았습니다. 그냥 fyi. –

+0

좋아, 모든 데이터베이스가 다중 값 IN 또는 NOT IN을 지원하는 것은 아닙니다. –