2009-09-08 4 views
4

좋아 서브 쿼리의 모든 결과를 삭제, 중복은 아주 쉽습니다없는 나의 기록하는 알아내는 내 previous questionMySQL은,

보고 :

SELECT * 
FROM eventlog 
GROUP BY event_date, user 
HAVING COUNT(*) = 1 
ORDER BY event_date, user 

내 중복이 아닌 모든 것을 반환합니다. 그래서 나는 그들을 "no_duplicates"라는 다른 테이블로 옮기고 원래의 테이블에서 삭제할 것이라고 생각했습니다. 그런 다음 원래 테이블에서 복제본을 모두 보거나 수정 한 다음 no_dupes을 다시 추가 할 수있었습니다. 그러나 동안 : 마법처럼

INSERT INTO no_duplicates 
SELECT * 
FROM eventlog 
GROUP BY event_date, user 
HAVING COUNT(*) = 1 
ORDER BY event_date, user 

작품, 다음과 같은 오류가 발생합니다 :

DELETE 
FROM eventlog 
GROUP BY event_date, user 
HAVING COUNT(*) = 1 
ORDER BY event_date, user 

내 생각 엔 그 쿼리는에 의해 삭제, 독특한, 이미 - 인 - 더 - 테이블 레코드를 반환하면서 집계 함수가 정결하지 않습니다. 내가 옮긴 기록 만 지워지는 것을 내가 무엇을 할 수 있는지 모른다는 것을 제외하고는 어느 것이 이해할 수 있습니다. 검색 한 후 "INSERT가 원본 테이블의 레코드를 강제 종료"구문을 찾지 못했지만 어쨌든 삭제가 실패한 동일한 이유 때문에 실패 할 것이라고 추측합니다.

누락 된 조각을 찾도록 도와 줄 수 있습니까?

답변

6

첫째 e.id = nd.id에 찾지 no_dupes 가입 이벤트 로그 전자에서, 당신은 INSERT와 DELETE에 ORDER BY가 필요 없다. 이러한 작업과 관련없는 프리젠 테이션을 위해 필요한 경우 유용합니다. 당신의 이벤트 로그 테이블이처럼 DELETE 문 형성 할 수 (ID 같은) 기본 키가있는 경우

: 당신은 DELETE syntax을 살펴해야

DELETE 
FROM eventlog 
WHERE id IN (
    SELECT * 
    FROM eventlog 
    GROUP BY event_date, user 
    HAVING COUNT(*) = 1 
) 
-1

당신은, 기본 키 자동 증가 열을 추가하려고 새 테이블로 유니크 이동 및 삭제 이벤트 로그를 할 수 있습니다. * 내부는

1

을,이 어느 그룹의 총격 사건은 없으며, 소유물 , ORDER.

+0

죄송합니다. 최대한 효율적으로 모든 것을 움켜 잡고있었습니다. ORDERS는 삭제할 필요가 없다는 것을 알고 있습니다. 그리고 나는 GROUP BY와 HAVING이 있다는 것을 빨리 배웠습니다. 그러므로 질문입니다. – Anthony

+0

ORDER는 DELETE에서 ** 허용되지 않습니다 ** (무의미한 것 제외) – soulmerge

+0

MySQL에서는'ORDER'가 절대적으로 * DELETE에서 허용됩니다. [매우 오랜 시간 동안] (https://dev.mysql.com/doc/refman/4.1/en/delete.html) * "DELETE 문에 ORDER BY 절이 있으면 행은 ORDER BY는 참조 무결성 위반을 피하는 데 필요한 순서로 행을 삭제하는 데 유용 할 수 있습니다 .ORDER BY는 DELETE와 함께 사용할 수 있습니다. MySQL 4.0.0부터 시작합니다. "* – dkarp

4

집계 함수로 삭제하지 않겠습니다. 삽입 된 모든 데이터를 삭제 하시겠습니까?

DELETE 
FROM eventlog 
WHERE (user, event_date) IN (SELECT user, event_data FROM no_duplicates) 
+0

그래서, 분명히하십시오.WHERE 절을 괄호 안에 넣으면 사용자와 이벤트 날짜가 모두 no_duplicates 테이블의 특정 행에 있어야 함을 의미합니까? 분명히 users와 event_dates는 둘 다에 걸쳐 독립적으로 반복되기 때문입니다. 좋아, 나는 급하게 또는 무능한 소리가 나는 것을 미워한다. 그래서 용서해주세요. 나는 이것을 재건하는 것이 훨씬 더 많은 시간을 필요로하고 사람들이 나를 더 짜증스럽게 만들 것이기 ​​때문에 정말로 염려 스럽다. 나는 마감 시간이 싫다. – Anthony

+0

예 - 100 % 확신해야 함 - 명령문을 시도하기 전에 항상 백업 – bernhardrusch

+0

이렇게하면 명령문은 사용자 AND event_date가 no_duplicates의 행과 동일한 모든 행을 삭제한다는 의미입니다. 나는 이것이 당신이 원하는 것이라고 생각하니? 그렇지 않으면 더 나은 키를 지정해야합니다 (id?) – bernhardrusch

4

데이터베이스가 무엇입니까 :

는 왜 이런 일을하려고? MySQL의 경우

Currently, you cannot delete from a table and select from the same table in a subquery.

적어도 5.0 버전의 경우. (http://dev.mysql.com/doc/refman/5.0/en/delete.html)