본문 바로가기

정리/Database

서브쿼리를 활용하여 조건을 주고 갱신하는 법

728x90

설명

  • 서브쿼리: (SELECT MAX(BB_HIS.TIME) FROM BB_HIS WHERE BB_HIS.KEY_COL = AA.KEY_COL AND BB_HIS.STATUS = 'INTERFACE')
    BB_HIS 테이블에서 KEY_COL이 동일하고 STATUS가 'INTERFACE'인 가장 최근 TIME 값을 조회하여, AA.TIME이 이 값보다 최신인 경우에만 BB를 갱신하도록 조건을 추가했습니다.

이렇게 하면 BB_HIS에 저장된 이력 데이터 중 STATUS = 'INTERFACE'의 최신 TIME 값 이후에 추가된 AA의 데이터만 반영할 수 있습니다.

여기에 

동일한 KEY_COL에 대해  BB_HIS 에서 INTERFACE 단계가 존재하는 경우 그 시간보다 AA.TIME 크거나  BB_HIS에서 INTERFACE 단계가 없으면 BB_HIS 중에 가장 최신으로 적재된 시간보다 큰 AA.TIME의 경우를 조건으로 넣으면 다음과 같이 쿼리를 짤 수 있습니다.

 

UPDATE BB
SET
    BB.COL1 = AA.COL1,
    BB.COL2 = AA.COL2,
    BB.TIME = AA.TIME
FROM AA
WHERE 
    BB.KEY_COL = AA.KEY_COL
    AND (AA.COL1 IS NOT NULL AND AA.COL2 IS NOT NULL)      -- COL1, COL2가 모두 NULL이 아닌 경우는 제외
    AND (BB.COL1 IS NULL OR BB.COL2 IS NULL)               -- BB의 COL1, COL2 중 하나만 존재하는 경우
    AND NOT (BB.COL1 = AA.COL1 AND BB.COL2 = AA.COL2)      -- COL1, COL2 값이 모두 동일한 경우는 제외
    AND AA.TIME > (
        COALESCE(
            (SELECT MAX(BB_HIS.TIME) 
             FROM BB_HIS 
             WHERE BB_HIS.KEY_COL = AA.KEY_COL 
               AND BB_HIS.STATUS = 'INTERFACE'),
            (SELECT MAX(BB_HIS.TIME) 
             FROM BB_HIS 
             WHERE BB_HIS.KEY_COL = AA.KEY_COL)
        )
    );                                                      -- INTERFACE 시간 또는 가장 최신 시간보다 큰 경우만 갱신