일괄 처리를 위한 갯수비교 0 4 603

by 느림보 [SQL Query] [2020.02.02 17:55:54]


입고된 data를 입고시킨후 해당입고번호에 따른 품목들을 전체 중단을 시켜야 로직이 필요합니다.

그래서 입고를 다 시킨후에, 그 입고번호의 item data를 불러오는걸 하려고 하는데..
문제는 입고시킨 다음 꼭 현장에서 다른액션을 하는경우가 발생해서.. 혹여 입고번호중 다른 액션이 있었다면 그 입고번호 전체를 불러오지 않게 하려고 합니다.

 

RCPTITEM      
입고번호 품목 순번 수량 LOC 
202001 ABC01 1 1 1A0101
202001 ABC02 2 1 1B0101
202001 BB011 3 1 1C0101
202001 BB012 4 10 1A0101
202001 BB013 5 1 1B0101
202001 BB014 6 1

1C0101

STOKM    
STOK LOC  수량
ABC01 1A0101 1
ABC02 1B0101 1
BB011 1C0101 1
BB012 1A0101 10
BB013 1B0101 1
BB014 1C0101 1

조회조건은 입고번호입니다. 쿼리를 어떻게 짜야할까요?

두개의 조건을 만족하는건 LOC과 ITEM , QTY 수량을 기반으로 맞는것을 가져오는건은 쉬운데

입고번호의 갯수에 다 맞춰져 있을때에만 뿌려줘야하는 부분이라 헷갈리네요

by jkson [2020.02.03 07:27:36]

제목이랑 내용이랑 무슨 말씀이신지 이해하기가 어렵네요.

RCPTITEM 테이블과 STOKM 테이블을 수량을 불일치하게 만드는 액션이 일어난다는 건가요?

그런 액션이 있으면 조회가 안 되게 한다는 말씀이신지..

언듯 보기에는 문제의 원인을 제거하지 않고 회피하려는 듯 보이는데..

예시를 들어주시는 게 좋겠습니다.


by 마농 [2020.02.03 08:02:48]
WITH rcptitem AS
(
SELECT 202001 rcpt_no, 'ABC01' item, 1 seq, 1 cnt, '1A0101' loc FROM dual
UNION ALL SELECT 202001, 'ABC02', 2,  1, '1B0101' FROM dual
UNION ALL SELECT 202001, 'BB011', 3,  1, '1C0101' FROM dual
UNION ALL SELECT 202001, 'BB012', 4, 10, '1A0101' FROM dual
UNION ALL SELECT 202001, 'BB013', 5,  1, '1B0101' FROM dual
UNION ALL SELECT 202001, 'BB014', 6,  1, '1C0101' FROM dual
)
, stokm AS
(
SELECT 'ABC01' item, '1A0101' loc, 1 cnt FROM dual
UNION ALL SELECT 'ABC02', '1B0101',  1 FROM dual
UNION ALL SELECT 'BB011', '1C0101',  1 FROM dual
UNION ALL SELECT 'BB012', '1A0101', 10 FROM dual
UNION ALL SELECT 'BB013', '1B0101',  1 FROM dual
UNION ALL SELECT 'BB014', '1C0101',  1 FROM dual
)
SELECT *
  FROM (SELECT a.rcpt_no, a.item, a.seq, a.cnt, a.loc
             , COUNT(a.item) OVER() cnt_a
             , COUNT(b.item) OVER() cnt_b
          FROM rcptitem a
          LEFT OUTER JOIN stokm b
            ON a.item = b.item
           AND a.loc  = b.loc
           AND a.cnt  = b.cnt
         WHERE a.rcpt_no = 202001
        )
 WHERE cnt_a = cnt_b
;

 


by 느림보 [2020.02.03 09:53:40]

문의를 참, 제가봐도 애매하게 했는데 딱 이해하시고 알려주셔서 감사합니다.

으아.. 생각보다 쉽게 풀렸네요.. 감사합니다.


by jkson [2020.02.03 10:41:14]

문제 발생 후 후처리보다는 원인을 제거하는 게 좋지 않을까요?

동시성이 크게 문제 되지 않는다면

stokm 테이블 해당 데이터를 lock 한다든지 하는 방법으로 수량 불일치가 나지 않게끔 로직을 구현하는 게 우선일듯 합니다.

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