설명
- 서브쿼리: (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 시간 또는 가장 최신 시간보다 큰 경우만 갱신
'정리 > Database' 카테고리의 다른 글
SQL 구분자 기준으로 여러행으로 나누기 (0) | 2024.10.26 |
---|---|
[Database] 기본 문법 Select , Delete ,Insert , Update (0) | 2023.11.14 |
[R] R과 Database 연동 (R과 DB 연동) (0) | 2018.12.02 |
Ubuntu서버에서 MariaDB 원격 접속하기 (0) | 2018.10.18 |