데이터 중복 제거 쿼리 재질문 드립니다. 0 5 1,551

by 데므 [SQL Query] mysql query [2019.10.01 09:39:41]


테이블.png (54,032Bytes)
데이터.png (36,525Bytes)

안녕하세요. 우선 이렇게 제가 모르는 것을 해결해주려고 봐주셔서 정말 감사합니다. 저번에 마농님께서 중복되는 데이터를 제거하려면 키 값이 필요하다고 해서 키 값을 넣었습니다. 이렇게 중복된 데이터가 있을 때 1개만 남기고 제거 하려고 합니다. 그리고 데이터가 1개만 있을 때는 제거가 안되고요. 조건절로는 where name='홍길동',sum=0,re_date=curdate(); 이렇게 3가지 조건을 주려고 합니다. 도움을 주시면 정말 감사하겠습니다.

by 마농 [2019.10.01 11:32:30]

1. 키를 추가하셨네요?
 - 어떤 방식으로 추가하신지 모르겠지만 테이블을 재편성 하신거네요.
 - 그럴거면 아예 Distinct 로 중복제거해서 새로 만들지 그랬어요?
2. sum, day 등의 예약어를 컬럼명으로 사용하셨네요?
 - 예약어 사용시 명령어와 컬럼명이 혼동되고
 - 오류 발생 가능성도 있습니다.
 - 예약어 사용은 지양해야 합니다.
 

-- 중복 제거 생성
CREATE TABLE food_user_back
AS
SELECT DISTINCT * FROM food_user
;
-- 중복 자료 삭제(1회성 작업, 건수를 알고 있을 때)
DELETE 
  FROM food_user
 WHERE name = '홍길동'
   AND sum = 0
   AND re_date = curdate()
 LIMIT 6
;
-- 중복 자료 삭제
DELETE 
  FROM food_user m
 WHERE name    = '홍길동'
   AND sum     = 0
   AND re_date = curdate()
   AND EXISTS (SELECT 1
                 FROM food_user s
                WHERE s.name    = m.name   
                  AND s.morning = m.morning
                  AND s.lunch   = m.lunch  
                  AND s.dinner  = m.dinner 
                  AND s.ex_1    = m.ex_1   
                  AND s.sum     = m.sum    
                  AND s.re_date = m.re_date
                  AND s.day     = m.day    
                  AND s.id      > m.id     -- 최대 ID 남기기
               -- AND s.id      < m.id     -- 최소 ID 남기기
               )
;

 


by 데므 [2019.10.01 11:51:06]

답변 정말 감사드립니다. 마농님께서 올려주신 3번째 중복 자료 삭제 sql문을 그대로 사용해보았는데 신택스 에러가 발생하네요 ㅜ sum은 f_sum으로 day는 re_day로 덕분에 수정했습니다. 감사합니다


by 데므 [2019.10.01 11:58:32]

 DELETE FROM food_user m WHERE name = '홍길동'
   AND f_sum     = 0
   AND re_date = curdate()
   AND EXISTS (SELECT 1
                 FROM food_user s
                WHERE s.name    = m.name  
                  AND s.morning = m.morning
                  AND s.lunch   = m.lunch  
                  AND s.dinner  = m.dinner 
                  AND s.ex_1    = m.ex_1   
                  AND s.f_sum     = m.f_sum   
                  AND s.re_date = m.re_date
                  AND s.re_day     = m.re_day   
                  AND s.id      > m.id    
               AND s.id      < m.id     
               );

 


by 마농 [2019.10.01 13:45:10]
-- MySQL 문법이 오라클이랑 다르네요.
-- 1. 테이블 복제에는 AS 가 빠져야 하네요.
CREATE TABLE food_user_back
-- AS -- 요 녀석이 없어야 하네요.
SELECT DISTINCT
       name   
     , morning
     , lunch  
     , dinner 
     , ex_1   
     , f_sum  
     , re_date
     , re_day 
  FROM food_user
;
-- 2. 이 부분은 문제 없구요.
DELETE
  FROM food_user
 WHERE name = '홍길동'
   AND f_sum = 0
   AND re_date = curdate()
 LIMIT 6
;
-- 3. 여기서는 알리아스 사용이 안되네요.
DELETE
  FROM food_user -- m -- 요 부분
 WHERE name    = '홍길동'
   AND f_sum   = 0
   AND re_date = curdate()
   AND EXISTS (SELECT 1
                 FROM food_user s
                WHERE s.name    = food_user.name  
                  AND s.morning = food_user.morning
                  AND s.lunch   = food_user.lunch  
                  AND s.dinner  = food_user.dinner 
                  AND s.ex_1    = food_user.ex_1   
                  AND s.f_sum   = food_user.f_sum   
                  AND s.re_date = food_user.re_date
                  AND s.re_day  = food_user.re_day   
                  AND s.id      > food_user.id     -- 최대 ID 남기기
               -- AND s.id      < food_user.id     -- 최소 ID 남기기
               )
;

 


by 데므 [2019.10.01 17:04:27]

정말 감사드립니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입