2013-04-29 1 views
0

비슷한 중복 물을 제거해야합니다.중복 된 항목을 삭제하고 헤더를 사용하여 중복 된 항목을 보존 하시겠습니까?

old1950 
old1933 
old1985 
new_1950 
new_1985 
new_2008 

삭제 명령을 실행 한 후 두어야 : 나는 다음과 같은 값으로 열이

old1950 
old1933 
old1985 
new_2008 

당신이 삭제 명령이 이전 내용을 보존해야 볼 수 있듯이.

모든 숫자 뒤에 문자 'old'또는 'new'가 있습니다.

어떻게이 목표를 달성 할 수 있습니까? 감사는

CREATE TABLE yourtable (
    `accountID` varchar(32) NOT NULL, 
    `deviceID` varchar(32) NOT NULL, 
    col VARCHAR(20), 
    PRIMARY KEY (`accountID`,`deviceID`) 
); 

INSERT INTO yourtable VALUES 
(1,1,'old1950'), 
(1,2,'old1933'), 
(1,3,'old1985'), 
(1,4,'new_1950'), 
(1,5,'new_1985'), 
(1,6,'new_2008'); 

DELETE y1 
FROM 
    yourtable y1 INNER JOIN yourtable y2 
    ON y1.col LIKE 'new_%' AND y2.col LIKE 'old%' 
    AND SUBSTR(y1.col, 5)=SUBSTR(y2.col, 4) 
+0

"* 테이블에 데이터를 추가하려고합니다."라고 말하지만 질문은 데이터 삭제에 대해서만 이야기합니다. 새로운 데이터를 삽입하려고하지만 중복을 무시하려면 UNIQUE 제약 조건을 만들고 INSERT IGNORE를 사용하십시오. 그렇지 않으면 이미 삽입 된 레코드를 삭제하려는 경우 "오래된 레코드"와 "새로운 레코드"를 어떻게 식별합니까? – eggyal

+0

죄송합니다, 제 잘못, 당신 말이 맞아요. –

+0

데이터가 데이터베이스에 있지만 삭제하고 다시 삽입 할 수 있습니다. 내가 말했듯이 오래된 레지스터는 말 그대로 'old'라는 헤더와 새로운 헤더 인 'new'를 가지고있다. 그래서 만약 내가 '새 %'LIKE를 사용하여 삭제할 수 있습니다 대답 –

답변

1

당신은이 쿼리를 사용할 수 fthiella하는


지금 나는 다음과 같은 코드를 실행하고있어이 작품을 좋아 :

DELETE y1 
FROM 
    yourtable y1 INNER JOIN yourtable y2 
    ON y1.col LIKE 'new%' AND y2.col LIKE 'old%' 
    AND SUBSTR(y1.col, 4)=SUBSTR(y2.col, 4) 

이 바이올린 here를 참조하십시오.

+0

답변 주셔서 감사합니다,하지만 작동하는 것 같다 내 테이블에 작동하지 않는 원인은 안전 모드에서, 그래서 WHERE 절에서 일부 키 열을 제공해야합니다. KEY 열은 AccountID와 DeviceID이며, 여기에 귀하의 예에서 추가해야합니까? –

+0

@e_blue 업데이트 쿼리 전에'SET SQL_SAFE_UPDATES = 0;'을 사용하여 안전 모드를 비활성화 한 다음 쿼리 후'SET SQL_SAFE_UPDATES = 1; '을 사용하여 다시 활성화 할 수 있습니까? 'something %'가 존재한다면 인덱스를 사용할 수 있기 때문에 SUBSTR이 ... 할 수 있다고 생각합니다. – fthiella

+0

안전 모드 (SET SQL_SAFE_UPDATES = 0;)를 해제 한 다음 실행하지만 0 영향을받은 행. –