Update Select 쿼리 질문입니다. 0 2 2,511

by 김태성 [SQL Query] update [2017.04.03 13:50:36]


유저가 웹 시스템에서 갱신하고싶은 부품을 선택해서 갱신 의뢰를 보냅니다. 이때 단품, 부모자식품(부모부품, 자식부품)로 종류가 나늬는데 유저의 갱신 의뢰 부품이 부모부품이거나, 자식부품이면 관련된 모든 부모자식품을 찾아서 항목을 갱신해주려합니다.(부모부품은 자식부품들의 합계로 견적치를 갱신한다거나 하거든요)

유저가 의뢰한 부품에대해서 관련된 부모자식품을 다 검색하는 쿼리는 만드는데 성공했습니다. 이걸 UPDATE하는것에서 막혀있습니다.

먼저 검색 쿼리를 적겠습니다.

SELECT DISTINCT TM.INZU
FROM    T_MITUMORI TM, 
    (SELECT * FROM T_MITUMORI WHERE MITUMORI_ID = 1031 AND MITUMORI_KBN = '1' ) TM2
WHERE     TM2.MITUMORIIRAI_NO = TM.MITUMORIIRAI_NO
     AND (
         ((CASE WHEN TM2.OYA_BUHIN_FLAG = 2 THEN TM2.OYA_BUHIN_NO
      ELSE TM2.BUHIN_NO END)
        = (CASE WHEN TM2.OYA_BUHIN_FLAG = 2 THEN TM.BUHIN_NO
             ELSE TM.OYA_BUHIN_NO END) AND TM2.SUFFIX = TM.SUFFIX)
     OR  (TM2.OYA_BUHIN_NO = TM.OYA_BUHIN_NO AND TM2.SUFFIX = TM.SUFFIX) 
     OR  (TM2.BUHIN_NO = TM.BUHIN_NO AND TM2.SUFFIX = TM.SUFFIX))
)

이렇게 적었습니다. 원래 TM2의 조건문에 1031이랑 '1'은 변수인대 테스트용으로 넣어둔 것일 뿐입니다.

DISTINCT는 유저가 동시에 여러부품을 의뢰를 보낼수 있는데 복수의 부품이 같은 부모자식관계에 있을 경우에 대비해서 넣은것입니다.

저 SELECT한 VIEW를 UPDATE에서 사용하려고 하면 ora 01732 뷰에 대한 데이터 조작이 부적합합니다. 가 나오더라구요.

UPDATE 
(
SELECT DISTINCT TM.INZU
FROM    T_MITUMORI TM, 
    (SELECT * FROM T_MITUMORI WHERE MITUMORI_ID = 1031 AND MITUMORI_KBN = '1' ) TM2
WHERE     TM2.MITUMORIIRAI_NO = TM.MITUMORIIRAI_NO
     AND (
         ((CASE WHEN TM2.OYA_BUHIN_FLAG = 2 THEN TM2.OYA_BUHIN_NO
      ELSE TM2.BUHIN_NO END)
        = (CASE WHEN TM2.OYA_BUHIN_FLAG = 2 THEN TM.BUHIN_NO
             ELSE TM.OYA_BUHIN_NO END) AND TM2.SUFFIX = TM.SUFFIX)
     OR  (TM2.OYA_BUHIN_NO = TM.OYA_BUHIN_NO AND TM2.SUFFIX = TM.SUFFIX)
     OR  (TM2.BUHIN_NO = TM.BUHIN_NO AND TM2.SUFFIX = TM.SUFFIX))
)
SET INZU = 1

UPDATE테이블에 뷰를 넣는게 아니라 SET이랑 조건문에 뷰를 넣어서 할수도 있을 것 같기는한데...왠지 퍼포먼스적으로 너무나도 나쁠 것 같아서 위의 방법으로 하는게 맞지 않나싶은데 잘 되지않아 여쭤봅니다.

by 마농 [2017.04.03 14:26:35]

글쎄요?
계층 쿼리로는 뭔가 부족해 보이네요.
OR 조건절 사용도 복잡하고
Distinct 사용도 맞는지 의문이네요.


테이블의 PK 및 쿼리에서 사용된 항목들에 대해 자세히 설명해 주세요.
각 컬럼의 의미와 저장되는 값에 대해 설명해 주세요.
계층구조는 1단계 구조인지? 다단계 구조인지?


by 김태성 [2017.04.03 14:52:58]

마농님 답변 감사합니다. 질문 올리고 계속 고민중인데 제 머리속에서도 정확히 이미지가 안그려져서 일단 뭘 어떻게 하고싶은지 노트같은곳에 좀 정리를 먼저 해봐야 할 것 같습니다. 정리가 되면 본문을 수정하거나 코멘트에 추가하겠습니다.

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