특정 테이블에 있는 코드의 date 기간만큼 다른테이블 B에서 삭제하고 싶습니다. 0 1 6,847

by 두유너우 [SQLServer] [2024.09.19 20:48:41]


테이블A    
CODE DEL_START_DT DEL_END_DT
A001 2024-09-19 19:00:00 2024-09-19 23:59:00
A002 2024-09-19 20:00:00 2024-09-19 23:59:00
A003 2024-09-19 17:00:00 2024-09-19 23:59:00

 

테이블B    
CODE DATE_TIME DESC
A001 2024-09-19 18:00:00 ABCD
A001 2024-09-19 18:00:00 GGGG
A001 2024-09-19 18:00:00 KKKK
A001 2024-09-19 19:00:00 DDD
A001 2024-09-19 19:00:00 GGG
A001 2024-09-19 20:00:00
A002 2024-09-19 18:00:00
A002 2024-09-19 18:00:00
A002 2024-09-19 19:00:00
A002 2024-09-19 20:00:00
A002 2024-09-19 20:00:00
A002 2024-09-19 20:00:00
A003

 

테이블 A 의 코드별로 start_dt 와 end_dt가 있습니다. 

코드별 start_dt와 end_dt를 테이블 B에서 코드별 해당 되는 범위의 데이터를 삭제하고 싶습니다. 

예를들어 A001 를 보시면 2024-09-19 19:00:00 ~ 2024-09-19 23:59:59 의 범위를 가진 코드값을 테이블 B에서 노란색 영역만큼만 삭제를 해야 합니다. 

예시는 A001 만 했는데 A001 ~ N 까지 입니다.

(환경은 mssql 입니다.)

집합적으로 생각을 하려고 해도 도저히 생각이 나지를 않네요 ㅜㅜ.. 커서를 이용해서 돌려야 하나 생각이 들다가 이곳에서 뭔가 알수  있지 않을까 하여 질문 드립니다.

by 마농 [2024.09.20 09:22:36]
-- 1. 삭제 대상 확인 --
SELECT *
  FROM b
 WHERE EXISTS (SELECT 1
                 FROM a
                WHERE b.code = a.code
                  AND b.date_time BETWEEN a.del_start_dt AND a.del_end_dt
               )
;

-- 2. 삭제 --
DELETE
  FROM b
 WHERE EXISTS (SELECT 1
                 FROM a
                WHERE b.code = a.code
                  AND b.date_time BETWEEN a.del_start_dt AND a.del_end_dt
               )
;

 

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