2011-11-23 1 views
2

이 테이블을 가정 연속 행에 중복을 삭제MySQL은

ID ColA ColB 
1 7 8 
2 7 9 
3 7 9 
4 5 8 
5 6 9 
6 6 9 
7 5 4 

약동학는 ID coumn입니다. 이제 ColAColB의 모든 중복을 연속 행에서 삭제하고 싶습니다.

이 예제에서 행 2,3 및 5,6에는 중복이 들어 있습니다. 더 높은 ID가 유지되도록 제거되어야합니다.

출력해야한다 : 이것은 MySQL과

ID ColA ColB 
1 7 8 

3 7 9 
4 5 8 

6 6 9 
7 5 4 

을 수행 할 수 있습니까?

감사합니다,

+0

미안하지만 시도해 보신 적 있나요? –

답변

1
select ID from MyTable m1 where 0 < (select count(*) from MyTable m2 where m2.ID = m1.ID - 1 and m2.ColA = m1.ColA and m2.ColB = m1.ColB) 

위르겐 그리고 다음은

delete from MyTable where ID in ... 

쿼리를 사용할 수 있습니다. 이렇게하면 모든 버전에서 확실하게 작동합니다. 난 보통은 MSSQL을 사용하기 때문에

SELECT (SELECT TOP 1 id FROM table WHERE colA = m.colA AND colB = m.colB ORDER BY id DESC) AS id, m.* 
FROM (SELECT DISTINCT colA, colB 
     FROM table) m 

구문 오류가있을 수 있습니다,하지만 아이디어는 비슷해야합니다

+0

매력적인 작품처럼 훌륭합니다! – Juergen

+0

내가 도울 수있어서 기쁩니다. –

+0

한 가지 문제가 남아 있습니다. SELECT를 사용하여 첫 번째 문장을 시도했지만, MyTable m1을 작성할 때 ... 구문 분석기가 m1에 대해 어떤 이유 (잘못된 SQL 구문)로 불평합니다. – Juergen

-1

당신이 얼마나 많은 기록에 따라이 가장 효율적인하지 않을 수 있습니다.

+0

MySQL에는 top 키워드가 없으며 대신 Limit가 사용됩니다. 또한 중복을 삭제하지 않습니다. 또한 선택한 항목은 질문에 정의 된 중복 (연속 된 첫 번째를 제외한 연속 된 ID)을 선택하지 않습니다. 미안하지만, 너를 downvote해야 해. –

+0

와일드 카드, 삭제 부분을 놓쳤습니다. 그것을 잘못 읽고 예, 나는 TOP 대신 LIMIT를 사용해야했습니다. 그건 내 ms 물건을 걷어차.하지만 만약 당신이 위의 쿼리 (위의) tabe을 삭제하면, 당신은 중첩 된 선택에없는 ID와 함께 남았을거야, 그리고 중첩 된 선택 내가 주문하기 때문에 첫 번째 가장 높은 ID를 선택합니다 에 의해 우리는 첫 번째를 선택하고 있습니다. m. *을 제거하십시오. – JohnathanKong

0

나는 '테스트'라는 첫 번째 테이블을 호출했습니다. 지금

create temporary table tmpTable (ColA int, ColB int); 
insert into tmpTable select ColA,ColB from test group by ColA, ColB; 

콜라 COLB 각각 동일한 조합 원래 테이블의 최대 번호를 선택

첫째 콜라 COLB 모두 동일한 조합을 보유하는 테이블을 생성한다. 마지막으로

create temporary table idsToKeep (ID int); 
insert into idsToKeep select (select max(ID) from test where test.ColA=tmpTable.ColA and test.ColB=tmpTable.ColB) from tmpTable; 

을 idsToKeep 테이블에없는 원래의 테이블의 모든 항목을 삭제 : (이러한 행이 있기 때문에 우리는 삭제하지 않으 idsToKeep라는) 새로운 테이블에이 넣어

delete from test where ID <> all (select ID from idsToKeep); 
+0

이 방법을 사용하면 가장 높은 ID를 가진 행이 삭제되지 않습니다. – drmatt

+0

행이 연속적이지는 않지만 동일한 ColA 및 ColB가 순서로 돌아 오면 작동하지 않습니다. – jsgoupil

2
CREATE TEMPORARY TABLE duplicates (id int primary key) 

INSERT INTO duplicates (id) 
    SELECT t1.id 
     FROM table t1 
     join table t2 on t2.id = t1.id + 1 
    WHERE t1.ColA = t2.ColA 
     and t1.ColB = t2.ColB 

-- SELECT * FROM duplicates --> are you happy with that? => delete 
DELETE table 
    FROM table 
    join duplicates on table.id = duplicates.id