mysql 쿼리 질문드리겠습니다. 0 1 787

by 밍밍밍밍 [MySQL] [2018.12.04 21:23:06]


20181204_212149.png (10,046Bytes)

안녕하세요. 테이블에 잘못들어간 값이 있어서 질문남겨드립니다.

codeNum, pCode1, pCode2 값이 같은 데이터중
처음 등록한 데이터(wrdt 컬림기준) 1개만 newYn컬럼에 Y값을 가질수 있습니다.

첨부파일에 보시면 마지막3개의 데이터가 Y값인데 원래 N값이 insert됐어야합니다.

(codeNum, pCode1, pCode2 값이같은 예시 하나만 캡쳐를 했습니다.)

해당테이블에 10만건정도 데이터가 있는데 아래2가지 경우를 실행할수 있는지 궁금합니다.


1. 처음에 등록한 데이터가 Y임에도 Y값을 가지고 있는 데이터 select

2. 처음에 등록한 데이터가 Y임에도 Y값을 가지고 있는 데이터를 N값으로 update

by 마농 [2018.12.06 09:11:41]
-- 1. 대상 그룹 조회
SELECT codeNum, pCode1, pCode2
     , COUNT(CASE WHEN newYn = 'Y' THEN 1 END) cnt_y
  FROM t
 GROUP BY codeNum, pCode1, pCode2
HAVING COUNT(CASE WHEN newYn = 'Y' THEN 1 END) > 1
;
-- 2. 대상 조회 1
SELECT *
  FROM t m
 WHERE m.newYn = 'Y'
   AND EXISTS (SELECT 1
                 FROM t s
                WHERE s.codeNum = m.codeNum
                  AND s.pCode1  = m.pCode1
                  AND s.pCode2  = m.pCode2
                  AND s.newYn   = m.newYn
                  AND s.wrdt    < m.wrdt
               )
;
-- 2. 대상 조회 2
SELECT *
  FROM t m
 INNER JOIN
       (SELECT codeNum, pCode1, pCode2
             , MIN(wrdt) wrdt
          FROM t
         WHERE newYn = 'Y'
         GROUP BY codeNum, pCode1, pCode2
        ) s
    ON m.codeNum = s.codeNum
   AND m.pCode1  = s.pCode1
   AND m.pCode2  = s.pCode2
   AND m.wrdt    > s.wrdt
 WHERE m.newYn   = 'Y'
;
-- 3. 대상 갱신
UPDATE t m
 INNER JOIN
       (SELECT codeNum, pCode1, pCode2
             , MIN(wrdt) wrdt
          FROM t
         WHERE newYn = 'Y'
         GROUP BY codeNum, pCode1, pCode2
        ) s
    ON m.codeNum = s.codeNum
   AND m.pCode1  = s.pCode1
   AND m.pCode2  = s.pCode2
   AND m.wrdt    > s.wrdt
   SET m.newYn   = 'N'
 WHERE m.newYn   = 'Y'
;

 

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