부탁드려요 조건!!이 아리송해요~ 0 15 3,023

by 현씨 [SQL Query] QUERY [2012.03.07 15:30:25]



안녕하세요~ 어제부터 은근히 머리싸매고 고민중에 있는 쿼리입니다.

생각해보면 간단할 줄 알았는데 갑자기 머리가 잘 안돌아가요~

부탁좀 드릴꼐요~~

일단 어떤 품명을 검색하는 쿼리가 있습니다.

이 쿼리에 사용구분 컬럼이 있는데(part_using_gu) 이컬럼의 값이 2인 도번은 조회가 되지 않아야 합니다.

하지만 2번임에도 불구하고 재고가 있다면 조회가 되어야 합니다.

일단은 원래 품명을 검색하는 쿼리입니다.



SELECT a.part_no, a.part_name, a.as_prod_code, a.k_srch_no srch_no, a.pack_unit, '' book_srch_no,
 a.k_prdt_code, a.agent_pri*1.1 agent_pri, a.repair_store_pri*1.1 repair_pri,
 a.real_buyer_pri buyer_pri, DECODE(RTRIM(a.buy_gu),'1','수입','2','외주','3','자가','???') buy_gu,
 ROUND(a.agent_pri/1.15,-1)*1.1 chong_pri, DECODE(a.part_using_gu,'2','미사용 상태','') using_gu,
 a.grade, a.remark
  FROM (SELECT part_no, part_name, pack_unit, k_srch_no, as_prod_code, k_prdt_code, agent_pri,
  repair_store_pri, real_buyer_pri, part_using_gu, grade, buy_gu, remark
  FROM SD_PART_MAST
  WHERE part_no LIKE RPAD(:ctrl.temp,12,' ')||'%'
  UNION ALL
 SELECT /*+ index(sd_part_mast.SD_PART_MAST_PK)*/
  part_no, part_name, pack_unit, k_srch_no, as_prod_code, k_prdt_code, agent_pri,
   repair_store_pri, real_buyer_pri, part_using_gu, grade, buy_gu, remark
 FROM SD_PART_MAST,
  (SELECT RPAD(pat_pno,12,' ') pat_pno, pat_epno FROM jajae.partmst
  WHERE pat_epno LIKE :ctrl.temp||'%' AND pat_pno != pat_epno)
 WHERE pat_pno = part_no) a


제가 위에 있는 쿼리로  밑에 조건을 붙여 완성한 쿼리입니다.



    SELECT a.part_no, a.part_name, a.pack_unit, a.k_srch_no,
 NVL(a.as_prod_code, ''), '',
 a.agent_pri*1.1, a.repair_store_pri*1.1, a.real_buyer_pri,
 DECODE(NVL(a.c_agent_pri,0),0,ROUND(a.agent_pri/1.15,-1),NVL(a.c_agent_pri,0))*1.1 chong_pri,
 DECODE(a.part_using_gu,'2','미사용 상태',''), a.grade,
 DECODE(RTRIM(a.buy_gu),'1','수입','2','외주','3','자가','???'), a.remark, a.k_prdt_code
  FROM (SELECT part_no, part_name, pack_unit, k_srch_no, as_prod_code, agent_pri, c_agent_pri,
  repair_store_pri, real_buyer_pri, part_using_gu, grade, buy_gu, remark, k_prdt_code
 FROM SD_PART_MAST
 WHERE part_no = RPAD(:temp,12,' ')
 UNION ALL
 SELECT /*+ index(sd_part_mast.SD_PART_MAST_PK)*/
  part_no, part_name, pack_unit, k_srch_no, as_prod_code, agent_pri, c_agent_pri,
  repair_store_pri, real_buyer_pri, part_using_gu, grade, buy_gu, remark, k_prdt_code
 FROM SD_PART_MAST,
  (SELECT RPAD(pat_pno,12,' ') pat_pno, pat_epno FROM jajae.partmst
  WHERE pat_epno = :temp AND pat_pno != pat_epno)
 WHERE pat_pno = part_no
 ) a
 WHERE a.part_no  NOT IN ( SELECT a.part_no
      FROM  AS_PART_STOCK a, SD_PART_MAST c
    WHERE YYMM  BETWEEN TO_CHAR(SYSDATE,'yyyy')||'01' AND TO_CHAR(SYSDATE,'yyyymm')
AND c.part_no = a.part_no
AND c.part_using_gu = '2'
   GROUP BY a.part_no
HAVING SUM(pre_y_qty+ipgo_qty-chgo_qty-exp_sun_chul_qty-NVL(pick_qty,0)) = '0');




위에 커리에 녹색을 제가 붙인것입니다.
part_using_gu 가 2이고 재고가 0인것은 조회가 안되도록

이렇게 하면 조회는 잘 되는데 속도가 너무 느리고

forms 라는 프로그램에서 적용하려고 하니까 자꾸 오류가 나요 저 쿼리자체로 토드에서 실행하면 오류가 안나는데

그래서 혹시 다른 방법 있으시면 부탁드립니다.



두번쨰로 고민한 방법은요~~~~~ AS_PART_STOCK    이 테이블이 재고 테이블인데요

다른 테이블이 있는데 그것은 AS_PART_STOCK
처럼 입출고 내역을 더해서 재고가 나오는 것이 아닌 

그 도번에 해당하는 재고 칼럼이 있어서 바로 재고를 확인 할 수 있는 테이블 이에요

    SELECT a.part_no
FROM  AS_PART_STOCK_view a, SD_PART_MAST c
    WHERE  c.part_no = a.part_no
AND c.part_using_gu = '2' 


이렇게 하면 part_using_gu = '2' 이면서 재고가 있는 도번이 조회되는데 


맨위에 있는 쿼리와 어떻게 접목시켜야 할지 감이 잘 안와서 첫번째방법을 쓴것입니다.

 AS_PART_STOCK_VIEW 테이블을 써서 하면 sum함수를 쓰지 않아도 되서 더 간결할 것 같은데요

도움 부탁드립니다.






 

by 마농 [2012.03.07 16:42:04]
 WHERE a.part_using_gu != '2'
    OR (SELECT c.재고
          FROM as_part_stock_view c
         WHERE c.part_no = a.part_no
        ) > 0
;

by 박상준 [2012.03.07 16:55:20]
NOT IN 조건을 IN 조건으로 바꾸면 되지 않나요?

현재 아래와 같은데...

 WHERE A.PART_NO NOT IN 
       (SELECT A.PART_NO 
         FROM AS_PART_STOCK A, 
              SD_PART_MAST C 
        WHERE YYMM BETWEEN TO_CHAR(SYSDATE, 'YYYY')||'01' AND TO_CHAR(SYSDATE, 'YYYYMM') 
              AND C.PART_NO = A.PART_NO 
              AND C.PART_USING_GU = '2' 
        GROUP BY A.PART_NO 
       HAVING SUM(PRE_Y_QTY+IPGO_QTY-CHGO_QTY-EXP_SUN_CHUL_QTY-NVL(PICK_QTY, 0)) = '0'
       );

이 조건을 아래와 같이

  WHERE A.PART_NO IN 
       (SELECT A.PART_NO
          FROM AS_PART_STOCK_VIEW A, SD_PART_MAST C 
         WHERE C.PART_NO = A.PART_NO 
           AND C.PART_USING_GU = '2' 
       );

이렇게 바꾸면 되지 않나요?


by 현씨 [2012.03.07 17:25:56]

SELECT /*+ rule*/a.part_no, a.part_name, a.as_prod_code, a.k_srch_no srch_no, a.pack_unit, '' book_srch_no,
 a.k_prdt_code, a.agent_pri*1.1 agent_pri, a.repair_store_pri*1.1 repair_pri,
 a.real_buyer_pri buyer_pri, DECODE(RTRIM(a.buy_gu),'1','수입','2','외주','3','자가','???') buy_gu,
 ROUND(a.agent_pri/1.15,-1)*1.1 chong_pri, DECODE(a.part_using_gu,'2','미사용 상태','') using_gu,
 a.grade, a.remark
  FROM (SELECT part_no, part_name, pack_unit, k_srch_no, as_prod_code, k_prdt_code, agent_pri,
  repair_store_pri, real_buyer_pri, part_using_gu, grade, buy_gu, remark
  FROM SD_PART_MAST
  WHERE part_no LIKE RPAD(:temp,12,' ')||'%'
  UNION ALL
  SELECT /*+ index(sd_part_mast.SD_PART_MAST_PK)*/
  part_no, part_name, pack_unit, k_srch_no, as_prod_code, k_prdt_code, agent_pri,
  repair_store_pri, real_buyer_pri, part_using_gu, grade, buy_gu, remark
  FROM SD_PART_MAST,
    (SELECT RPAD(pat_pno,12,' ') pat_pno, pat_epno FROM jajae.partmst
    WHERE pat_epno LIKE :temp||'%' AND pat_pno != pat_epno)
  WHERE pat_pno = part_no) a
 WHERE a.part_using_gu != '2'
    OR (SELECT c.STOCK_QTY
  FROM as_part_stock_view c , SD_PART_MAST a
WHERE c.part_no = a.part_no
    ) > 0


마농님 이렇게 하라는 말씀이신가요?? 그럼 실행이 안되는데요~제가 부족해서 ㅡㅡ;;;

박상준님 이 알려주신 쿼리는 PART_USING_GU가 2이면서 재고 있는 도번을 포함시키라는 것인데

그럼 따로 바깥 쿼리에다가 not PART_USING_GU = '2' 을 해줘야 되는것 같기도

그런데 IN 부분을 제가 사용할 프로그램에서 먹지 않는 것 같아서요~;;;;;

다른방법이 필요합니다. ㅡㅜㅜㅜㅜㅜ

by 마농 [2012.03.07 17:29:29]
아니요..
제가 드린 쿼리 그대로에요 고치지 마시고

by 현씨 [2012.03.07 17:53:47]

SELECT /*+ rule*/a.part_no, a.part_name, a.as_prod_code, a.k_srch_no srch_no, a.pack_unit, '' book_srch_no,
 a.k_prdt_code, a.agent_pri*1.1 agent_pri, a.repair_store_pri*1.1 repair_pri,
 a.real_buyer_pri buyer_pri, DECODE(RTRIM(a.buy_gu),'1','수입','2','외주','3','자가','???') buy_gu,
 ROUND(a.agent_pri/1.15,-1)*1.1 chong_pri, DECODE(a.part_using_gu,'2','미사용 상태','') using_gu,
 a.grade, a.remark
  FROM (SELECT part_no, part_name, pack_unit, k_srch_no, as_prod_code, k_prdt_code, agent_pri,
    repair_store_pri, real_buyer_pri, part_using_gu, grade, buy_gu, remark
  FROM SD_PART_MAST
    WHERE part_no LIKE :temp||'%'
  UNION ALL
  SELECT /*+ index(sd_part_mast.SD_PART_MAST_PK)*/
    part_no, part_name, pack_unit, k_srch_no, as_prod_code, k_prdt_code, agent_pri,
    repair_store_pri, real_buyer_pri, part_using_gu, grade, buy_gu, remark
   FROM SD_PART_MAST,
    (SELECT RPAD(pat_pno,12,' ') pat_pno, pat_epno FROM jajae.partmst
    WHERE pat_epno LIKE :temp||'%' AND pat_pno != pat_epno)
    WHERE pat_pno = part_no) a
  WHERE a.part_using_gu != '2'
  OR (SELECT c.STOCK_QTY
  FROM as_part_stock_view c
  WHERE c.part_no = a.part_no) > 0


마농님이 주신 그대로 넣으면 ora-00936 이 하단에 나와요

혹 제가 무엇을 이해하지 못하고 있나요??ㅜㅜㅜ

by 마농 [2012.03.07 18:18:26]
글쎄요! 문제 없어 보입니다.
- 조건 빼고 하면 에러 안나나요?
- 다른 툴에서도 실행해 보세요.

by 마농 [2012.03.07 18:23:55]

forms 에서 꺽쇠 > 가 안먹는것은 아닌지요?
" > 0 "
을 " != 0 " 으로 바꿔도 보세요.

by 현씨 [2012.03.07 18:24:45]

네 조건 뺴고 실행하면 에러가 안나요~

oracle7.3 인데 버전이 낮아서 그런가요???ㅡㅜㅜ

by 마농 [2012.03.07 18:29:15]

헉!...7.3

by 마농 [2012.03.07 18:34:18]
SELECT *
  FROM (...) a
     , as_part_stock_view c
 WHERE a.part_no = c.part_no(+)
   AND (a.part_using_gu != '2' OR c.stock_qty > 0)
;

by 현씨 [2012.03.07 18:47:08]

네 ㅡㅡ;;;좀 낙후됬져 ㅎㅎ;;
마농님꼐서 알려주신데로 하니 결과값이 나오네요

원래는 한도번이 나와야 되는데 두도번이 조회됐었거든요

근데 한개 도번이 8개정도 중복되어서 나와요~값은 다 똑같구요

귀찮게 해드리는 것 같아서 죄송함다 ㅜㅜㅜ


by 손님 [2012.03.08 08:01:54]

as_part_stock_view 테이블이 part_no 가 유일하지 않은가요?
위에 질문을 보면 유일한것처럼 쓰여 있는데... 그렇지 않은 모양이네요?

by 마농 [2012.03.08 09:08:54]

c 로부터 part_no에 대한 유일한 재고값을 리턴받기 위한 조건이 추가되거나.. 예를들면 년도 조건?
그런게 없고 part_no 가 여러개 나올수밖에 없다면 c 를 직접 조인하지 말고
인라인뷰로 감싸서 안에서 Group By part_no 로 Sum 해서 재고를 가져와 조인해야 할듯.

by 손님 [2012.03.08 11:24:38]

네 한번 해보겠슴니다. 다시 댓글 올릴꼐요~~^^ 감사함니다`


by 손님 [2012.03.08 19:31:58]
 마농님께서 알려주신데로 하니 제대로 나옵니다.~~^^ 감사합니다.

속도가 더 느려지긴 했지만 하나 더 안듯한 것 같에서 좋아요~

힌트를 쓰던 속도좀 줄여야 겠어요 ㅎ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입