update 구문 질문 0 4 5,418

by 달타냥 [SQL Query] sql update oracle [2016.12.02 19:07:03]


안녕하세요?

update 문 관련해서 좀 이상한 점이 있어서 질문드립니다.

update tbl_detail a

    set a.indi_status = (select b.indi_status from tbl_ppl b where b.jumin_no = a.jumin_no)

tbl_ppl 은 jumin_no(주민번호) 를 키로 해서 status (상태값) , 단 두개로만 만들어져 있습니다.

tbl_detail 테이블의 status (상태값) 업데이트를 위해 임시로 주민번호와 상태값 두개만으로 데이터를 만들었습니다.

status 값은 a, b, c 딱 세개로만 구성되어있고 null 은 존재하지 않습니다.

tbl_detail 테이블은 시도, 시군구, 주민번호, 상태값 이렇게 네개로 구성되어있고 각 시도/시군구별로 주민번호

가 중복은 없으나 전체적으로 보면 한개 이상의 주민번호는 있는 상태입니다.

그런 상태에서 위 update 문을 실행했는데

업데이트된 tbl_detail 테이블의 status 값은 추출한 상태값 a, b, c 이 세가지를 벗어날수가 없는데 이상하게 null 이 들어

가 있습니다. 도데체 왜 이런 현상이 벌어지는지 모르겠습니다.

조언을 부탁드립니다.

감사합니다.

 

by Dev03 [2016.12.02 20:45:21]

tbl_detail 의 null 로 업데이트 되는 jumin_no 가 tbl_ppl에 존재하지 않는것 같습니다.


by 달타냥 [2016.12.02 20:51:25]

두 테이블에 있는 주민번호는 정확히 일대일로 매칭이 되진 않습니다.

한쪽에만 있는 주민번호가 존재는 하는데... 서로 매칭이 안되면

null 입력이 되는게 당연한건가요?

update tbl_detail a

    set a.indi_status = (select b.indi_status from tbl_ppl b where b.jumin_no = a.jumin_no)

이 문장에서는 tbl_ppl 의 indi_status 는 null 이 전혀 없습니다.

설명을 좀 부탁드려요.


by jkson [2016.12.03 07:59:49]

select 절로 update하라는 구문이기에 select절이 null 값이면 null로 업데이트 하겠죠.

select * from tbl_detail a
where not exists (select 1 from tbl_ppl b where b.jumin_no = a.jumin_no)

이렇게 조회해보시면 해당 건들이 나올 것 같네요.

null로 update하면 안 된다면 이런 데이터 제외하고 업데이트하게 만들어야겠죠.

update tbl_detail a

    set a.indi_status = (select b.indi_status from tbl_ppl b where b.jumin_no = a.jumin_no)

where exists (select 1 from tbl_ppl b where b.jumin_no = a.jumin_no)

아니면 해당 건들에 대해 다른 조치를 하시든지요.


by 마농 [2016.12.05 10:24:31]

UPDATE 절에 WHERE 절이 없으면 전체 UPDATE 하는거죠.

SET 절의 서브쿼리는 데이터를 가져오기 위함입니다.

업데이트 대상을 걸러내는 역할의 서브쿼리가 WHERE 절에 필요합니다.

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