딜리트 머지 질문 0 7 2,075

by 생택쥐포도 [Oracle 기초] [2023.04.11 15:29:23]


안녕하세요. 하기와 같이 데이터가 존재합니다.

DELETE 문을 구성하고싶은데

조건이 LOOP문으로 구성하고싶거든요.

각 이름, 세일기간종료, 재고개수에 따른 삭제조건을 넣고싶습니다.

 

apl_t테이블에서 입력개수가 eoh_t의 현재개수보다 작으면 삭제.

이때, apl_t 기간시작, 종료일은  eoh_t와 동일해야합니다.

 

 

하기정보 테이블명 : APL_T

이름 기간시작 기간종료 입력개수
사과 20230411 14:20 20230411 15:00 500
포도 20230410 11:30 20230410 12:30 300
딸기 20230410 19:00 20230412 20:00 200

 

하기정보 테이블명 : eoh_t

이름 세일기간시작 세일기간종료 입력개수
사과 20230411 14:20 20230411 15:00 1000
포도 20230410 11:30 20230410 12:30 280
딸기 20230410 19:00 20230412 20:00 195

 

결과

이름 세일기간시작 세일기간종료 현재개수
포도 20230410 11:30 20230410 12:30 300
딸기 20230410 19:00 20230412 20:00 200

 

 

by 마농 [2023.04.11 15:37:22]

요청사항이 명확하지 않습니다.
테이블이 두개인 건가요? 예시는 하나 뿐이네요?
각 테이블 예시와 원하는 결과표 예시가 필요합니다.
무얼 지우겠다는 건가요? 목적어가 불분명 합니다.
실시간이라면? 트리거를 원하는 걸까요?


by 생택쥐포도 [2023.04.11 15:54:40]

내용 수정하였습니다


by 마농 [2023.04.11 16:00:23]

뭘 삭제하나요? 삭제 대상에 표시를 헤주시거나. 최종 결과표를 그려주세요.


by 마농 [2023.04.11 16:16:28]
-- 1. 삭제 대상 확인
SELECT *
  FROM apl_t a
 WHERE 입력개수 < (SELECT 현재개수
                     FROM eoh_t
                    WHERE 이름 = a.이름
                      AND 세일기간시작 = a.기간시작
                      AND 세일기간종료 = a.기간종료
                   )
;
-- 2. 삭제
DELETE 
  FROM apl_t a
 WHERE 입력개수 < (SELECT 현재개수
                     FROM eoh_t
                    WHERE 이름 = a.이름
                      AND 세일기간시작 = a.기간시작
                      AND 세일기간종료 = a.기간종료
                   )
;

 


by 생택쥐포도 [2023.04.12 10:18:30]

감사합니다 마농님

조회할 테이블 eoh_t가 너무커서

속도가 안나와

프로시저를만들어서 하기 부분에

a.이름,기간시작, 종료를 변수로 처리해 loop문 돌리고싶은데..도움좀 부탁드려요

 

SELECT 현재개수

                     FROM eoh_t

                    WHERE 이름 = a.이름

                      AND 세일기간시작 = a.기간시작

                      AND 세일기간종료 = a.기간종료


by 마농 [2023.04.12 10:33:06]

(이름, 세일기간시작, 세일기간종료, 현재개수)
또는 (이름, 세일기간시작, 세일기간종료) 로 이루어잔 결합인덱스가 있어야 합니다.
루프를 돌리더라도 인덱스는 필요합니다.


by 생택쥐포도 [2023.04.12 10:55:18]

답변 감사합니다!

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