SQLite Update 쿼리 질문입니다. 0 5 1,343

by 시리 [DB 기타] [2017.02.06 16:13:51]


바코드 명이 같은 

SURVEY_PROD 라는 테이블에 있는 정보를

SURVEY_HIS에 덮어씌워 주는 쿼리인데요.

 

String sql = " update survey_his " +
        " set " +
        " dept_id = (select dept_id from survey_prod where survey_his.dept_id = survey_prod.dept_id) , "  +
        " LOCA_ID = (select LOCA_ID from survey_prod where survey_his.LOCA_ID = survey_prod.LOCA_ID) , " +
        " EMP_ID = (select EMP_ID from survey_prod where survey_his.EMP_ID = survey_prod.EMP_ID) , " +
        " PROD_STATUS_FLG = (select PROD_STATUS_FLG from survey_prod where survey_his.PROD_STATUS_FLG = survey_prod.PROD_STATUS_FLG) " +
        " where survey_his.prod_Barcode = ? " +
        "";

 

이 쿼리는 잘 돌아갑니다.

 

그런데

하나하나 바코드로 읽어오지 않고 부서 아이디로 업데이트 하기 위해서

 

String sql = " update survey_his " +
        " set " +
        " dept_id = (select dept_id from survey_prod where survey_his.dept_id = survey_prod.dept_id) , "  +
        " LOCA_ID = (select LOCA_ID from survey_prod where survey_his.LOCA_ID = survey_prod.LOCA_ID) , " +
        " EMP_ID = (select EMP_ID from survey_prod where survey_his.EMP_ID = survey_prod.EMP_ID) , " +
        " PROD_STATUS_FLG = (select PROD_STATUS_FLG from survey_prod where survey_his.PROD_STATUS_FLG = survey_prod.PROD_STATUS_FLG) " +
        " where survey_his.dept_id = ? ";

 

이런 식으로 작성하면 돌지 않네요...

어떤 식으로 변경해야 하는지 도움 요청드립니다.

by 신이만든짝퉁 [2017.02.06 16:26:09]

아래 쿼리에서 오류가 나는 이유는 서브쿼리에서 2개 이상의 row를 리턴하기 때문인 것으로 보여집니다.

해당 작업을 편하게 하기 위한 merge 라는 기능을 오라클에서 제공하고 있으니 아래 강좌를 참고하셔서 사용하시면 됩니다.

http://www.gurubee.net/lecture/2225


by 신이만든짝퉁 [2017.02.06 16:32:19]

오라클이 아니군요. 죄송합니다. ^^;

sqlite 에서는 merge 를 지원하지 않으니, 건단위로 루프를 돌아가며 수정해야 될 것 같습니다.


by 시리 [2017.02.06 17:08:02]

sqlite도 다중 업데이트를 시키는 방식이 있을 텐데 오라클보다 찾기가 너무 어렵네요 ㅠㅠ

오라클에서 merge의 존재를 상기시켜 주셔서 감사합니다

sqlite도 그런 것이 있나 찾아보겠습니다


by 마농 [2017.02.06 16:34:55]

기존 쿼리의 문제점.
  - dept_id 가 같은 자료의 dept_id 를 찾아 dept_id 에 dept_id 를 갱신
  - 같은 자료로 갱신하고 있으므로, 결론은 아무런 변화 없음
  - 무의미한 처리임.
변경 쿼리의 문제점.
  - 조건만 다를 뿐 서브쿼리는 동일함
  - 변경 쿼리에 문제가 있는게 아니라 원본 쿼리가 원래 문제가 있음.
  - 변경 대상 데이터에 따라 문제가 발생하기도 하고 아니기도 한 것임.
  - 문제는 서브쿼리에서 2개 행 이상 조회되었을 가능성 있음.
결론은
  - 애초부터 이상한 쿼리였음
  - 개념 설계를 다시해서 쿼리 새로 작성해야 할 듯
  - 서브쿼리의 조건이 각각의 컬럼 조건이 아닌, 테이블의 PK 조건으로 주는게 맞을 듯.


by 시리 [2017.02.06 17:06:56]

자세히 설명을 해 주셨는데 먼저 답변 주신 분을 채택해서 죄송합니다...

dept_id가 변경되는 경우가 있는데도 돌지 않는 쿼리인가요?

제가 뭔가 잘못 짠 거 같은데 동작을 해서 이상하게 생각하다가 질문을 해 보았습니다 ㅠㅠ...

 

다시 업데이트를 찾아봐야겠네요 ㅠㅠ...

로그 테이블에서 읽어오는 방식으로 구현을 해야 하는데 너무 어렵습니다.

 

 

서브쿼리의 조건이 각각의 컬럼 조건이 아닌, 테이블의 PK 조건으로 주는게 맞을 듯. <- 방식을 고민해 보겠습니다

항상 감사드립니다

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