2017-02-02 1 views
2

다섯 개의 관련 필드가있는 표;MySQL 테이블에서 "여분의"빈 행을 제거하는 방법은 무엇입니까?

ID (Autoincrement,unique, etc) 
ID_customer - ties in each row to another table with customers, not unique, not NULL 
value1 - can be 0 and NULL (NULL is not 0) 
value2 - can be 0 and NULL (NULL is not 0) 
type - can be 1 or 0 

나는 테이블을 통해 이동과 고객이 하나 개 이상의 행이 입력에 같은 값을 가진 여러 행이있는 경우, 자신의 가치 만 0이 그러한 행을 제거 각각의 경우를 찾으려면 열. 예를 들어;

1 1 40 8 1 
2 1 0 0 1 <-- 
3 1 30 5 0 
4 1 45 8 0 

이 경우 명령은 표시된 행을 제거해야하지만 나머지는 그대로 두어야합니다. 그리 어렵지 않습니다. 이런 식으로 뭔가 아마 (유형 = 0 반복) 일 것이다 :

DELETE FROM table 
WHERE value1 = 0 AND value2 = 0 AND type = 1 
    AND ID_customer IN 
     (SELECT ID_customer 
     FROM table 
     WHERE type = 1 GROUP BY ID_customer HAVING count(*) > 1) 

문제는 이와 같은 경우가 존재할 수 있습니다 :

5 2 0 0 1 
6 2 0 0 1 <-- 
7 2 0 0 0 
8 2 0 0 0 <-- 

어떤 경우에는 내가 행의 두 가지를 제거 할 것, 모든 행은 아닙니다. 중복 열을 제거 할 수있는 방법이 있습니까? 값 열이 0 일 때만? 이 작업 (다시, 유형 = 0 반복) 또는 뭔가 놓치고 있습니까?

DELETE 
FROM TABLE 
WHERE value1 = 0 AND value2 = 0 AND TYPE = 1 
    AND ID NOT IN 
    (SELECT ID 
    FROM TABLE 
    WHERE value1 = 0 AND value2 = 0 AND TYPE = 1 
    GROUP BY ID_customer) 

편집 : 나는 다른 중복 제거 질문에 검토 한 결과,하지만 난 (내가 중복의 일부를 유지하려는 곳에서) 내 테이블이 요구하는 방식으로 하위 쿼리를 정의하는 하나를 찾을 수 없습니다.

+0

사용자 및 유형마다 둘 이상의 중복이있을 수 있습니까? – Shadow

+0

예, 값 열이 0이 아닌 한. – Pontus

+0

@JanZeiseweis 다시 한 번, 중복으로 표시된 주제는 첫 번째 부분이 아닌 두 번째 부분에만 응답합니다. 질문의 삭제 쿼리에서 구문 오류가 발생합니다 (수정중인 동일한 테이블에서 선택할 수 없음) – Shadow

답변

1

그래서 첫 번째 문제에 대한 :

DELETE 
FROM table1 
WHERE value1 = 0 
    AND value2 = 0 
    AND TYPE = 1 
    AND ID_customer IN 
     (SELECT ID_customer 
     FROM 
      (SELECT ID_customer 
       FROM table1 
       WHERE TYPE = 1 
       GROUP BY ID_customer 
       HAVING count(*) > 0) AS derived) 
:

는 첫 번째 문제에 대한 귀하의 질의는 (서브 쿼리를 중첩) 파생 테이블을 사용하는 경우는 잘 작동하지만 오류 (You can't specify target table 'table1' for update in FROM clause

원인

DELETE 
FROM table1 
WHERE ID IN 
     (SELECT dups.ID 
     FROM 
      (SELECT t1.ID 
       FROM table1 t1 
       JOIN table1 t2 ON t1.ID_Customer = t2.ID_Customer 
       AND t1.value1 = t2.value1 
       AND t1.value2 = t2.value2 
       AND t1.type = t2.type 
       AND t1.ID > t2.ID 
       WHERE t1.value1 = 0 
        AND t2.value2 =0) AS dups); 
0 :

는 두 번째 문제에 대한 접근 방식은 매우 유사뿐만 아니라 ID 필드를 사용하고

희망이 도움이됩니다.

+0

"첫 번째"행을 선택하는 것 이외에 전체 이중 테이블 후프를 수행하는 이유가 있습니까? 첫 번째 문제에 제공 한 것과 유사한 솔루션이 참조하는 동일한 테이블에서 삭제할 수없는 문제를 해결하는 데에도 똑같이 잘 작동하지 않을까요? – Pontus

+0

'이중 테이블 후프 (double table hoop) '로'self-JOIN'을 의미하는 것 같습니다. 그것은 실제로 중복을 찾는 다른 방법이며, 아마도'group by '을 사용하여 동일하게 할 수 있습니다. 이런 식으로 나에게 편안함을 느꼈다. –

+0

고 카트, 고마워. – Pontus

관련 문제