본문 바로가기

DB엔지니어가 공부하는 python

[python_주소DB가지고놀기] 주소DB 월변동분 적용 하기 #4

[python_주소DB가지고놀기] 주소DB 월변동분 적용 하기 #4

 

#전편 바로가기

2020/01/30 - [DB엔지니어가 공부하는 python] - [python_주소DB가지고놀기] 파이썬, ubuntu에서 crontab 등록 하여 실행 하기 #3

 

[python_주소DB가지고놀기] 파이썬, ubuntu에서 crontab 등록 하여 실행 하기 #3

#[python_주소DB가지고놀기] 파이썬, ubuntu에서 crontab 등록 하여 실행 하기 #3 안녕하세요. 지난시간에 올린 포스팅에 보충 설명이 필요할 것 같아서요. 제가 물론 부족해서... 해맸던 내용인데, 여러분들은 그..

stricky.tistory.com

 

안녕하세요!

 

지난번 파이썬을 이용해서 주소DB 위경도 값을 받아오고, ubuntu에서 crontab 등록하여 실행하는 작업을 리뷰했었습니다. 이번에는...

 

월변동분을 적용 하는 방법을 알려드리겠습니다.

 

먼저, 데이터를 다운 받아야 겠죠?

 

처음 데이터를 넣을때와 마찬가지로 공공데이터포털에 들어갑니다. 혹은 아래 링크로 가시면 바로 들어갈수 있습니다.

http://www.juso.go.kr/addrlink/addressBuildDevNew.do?menu=match

 

주소DB | 도로명주소 DB 다운로드 | 도로명주소 개발자센터

주소DB (구 매칭데이터) --> 주소DB는 여러 개의 건물이 하나의 도로명주소를 갖는 집합 건물(예: 아파트)의 경우 한 건의 주소정보를 제공하도록 구성된 주소 단위의 DB입니다. 600만여 건의 주소와 800만여 건의 지번정보를 바탕으로 사용자의 필요에 따라 선택적으로 활용할 수 있도록 도로명코드 / 주소 / 지번 / 부가정보로 분리·구성하였습니다. 매월 전체 주소DB를 정기적으로 제공하며, 매일 주소변동정보를 연계서비스 및 안내홈페이지를 통해 제공하

www.juso.go.kr

그러면 아래와 같은 화면을 보실수 있으실겁니다.

화면에 빨간색으로 표시한 월변동 자료에서 12월분을 다운 받아주세요.

 

물론, 처음 구축한것이 12월분이였다면 다음달 초에 나올 1월분을 받아서 갱신을 해야하겠죠?

 

주소DB는 한번 다운을 받으면 매월 갱신을 해줘야 합니다. 매일 갱신할수있는 일변동 자료도 있지만,

 

이 작업을 직업적으로 하지 않는 이상 월변동 작업만 하시는걸 추천해 드립니다.

 

월변동분 자료를 다운받으셔서 압축을 풀면 5개의 파일을 보실수 있습니다.

 

이젠 이 파일들을 열어서 utf8 케릭터 셋으로 변경하여 저장 하겠습니다.

 

저같은 경우는 텍스트 파일을 서버에 옮겨서 마리아DB의 LOAD DATA LOCAL INFILE 기능을 사용하여 insert 하는데, 이걸 그냥 ubuntu서버로 옮기면 한글이 깨지더라구요.

이렇게 메모장으로 텍스트 파일을 열어 다른이름으로 저장 하기를 합니다.

 

그러면, 아래와 같은 창이 뜨고, 우측 하단에 인코딩 이 보이실겁니다. 옆에 있는 리스트 박스를 눌러줍니다.

 

거기서 UTF-8을 선택하고 rename 하여 저장을 합니다.

그리고 나서 mariadb가 설치되어 있는 ubuntu 서버로 옮깁니다.

 

물론 이 과정은 본인 pc에 깔려있는 DB 클라이언트를 이용하여 바로 테이블에 넣어도 됩니다.

 

하지만, 속도면에서 LOAD DATA LOCAL INFILE 기능을 이용하는편이 더욱 유리합니다.

 

이렇게 텍스트 파일을 옮기고 나면 이젠 기존에 있는 주소DB 테이블 4개가 있었을겁니다.

 

그거말고 5개의 월 변동분 저장용 테이블을 생성해 줍니다.

 

생성 스크립트도 드릴께요...ㅎㅎ

create table address_svc_m.add_info_month
(
	mgmt_num varchar(25) not null comment '관리번호'
		primary key,
	adm_dong_cd varchar(10) null comment '행정동코드',
	adm_dong_nm varchar(50) null comment '행정동명',
	zipcode varchar(5) null comment '우편번호',
	zipcode_seq varchar(3) null comment '우편번호일련번호',
	plent_dlvr_nm varchar(100) null comment '다량배달처명',
	build_rgst_nm varchar(100) null comment '건축물대장건물명',
	sgg_build_nm varchar(100) null comment '시군구건물명',
	multi_unit_yn varchar(1) null comment '공동주택여부'
);

create table address_svc_m.jibun_info_month
(
	mgmt_num varchar(25) not null comment '관리번호',
	seq varchar(12) not null comment '일련번호',
	law_dong_cd varchar(10) null comment '법정동코드',
	sd_nm varchar(50) null comment '시도명',
	sgg_nm varchar(50) null comment '시군구명',
	law_umd_nm varchar(50) null comment '법정읍면동명',
	law_ri_nm varchar(50) null comment '법정리명',
	san_yn varchar(1) null comment '산여부',
	jb_main_num int(4) null comment '지번본번(번지)',
	jb_sub_num int(4) null comment '지번본번(호)',
	main_yn varchar(1) null comment '대표여부',
	primary key (mgmt_num, seq)
);

create table address_svc_m.juso_info_month
(
	mgmt_num varchar(25) not null comment '관리번호'
		primary key,
	road_nm_cd varchar(12) not null comment '도로명코드',
	umd_seq varchar(2) not null comment '읍면동일련번호',
	basement_yn varchar(1) null comment '지하여부',
	build_main_num int(5) null comment '건물본번',
	build_sub_num int(5) null comment '건물부번',
	base_area_num varchar(5) null comment '기초구역번호',
	update_type_cd varchar(2) null comment '변경사유코드',
	anncmt_date varchar(8) null comment '고시일자',
	orgn_road_nm_addr varchar(100) null comment '변경전도로명주소',
	get_detail_addr_yn varchar(1) null comment '상세주소부여여부'
);


create table address_svc_m.road_cd_info_month
(
	road_nm_cd varchar(12) not null comment '도로명코드',
	umd_seq varchar(2) not null comment '읍면동일련번호',
	road_nm varchar(160) null comment '도로명',
	road_roma_nm varchar(160) null comment '도로명로마자',
	sd_nm varchar(50) null comment '시도명',
	sd_roma_nm varchar(100) null comment '시도로마자',
	sgg_nm varchar(50) null comment '시군구명',
	sgg_roma_nm varchar(100) null comment '시군구로마자',
	umd_nm varchar(50) null comment '읍면동명',
	umd_roma_nm varchar(100) null comment '읍면동로마자',
	umd_gb varchar(1) null comment '읍면동구분',
	umd_cd varchar(3) null comment '읍면동코드',
	use_yn varchar(1) null comment '사용여부',
	update_rs_cd varchar(1) null comment '변경사유',
	update_his_info varchar(14) null comment '변경이력정보',
	anncmt_date varchar(8) null comment '고시일자',
	erase_date varchar(8) null comment '말소일자',
	primary key (road_nm_cd, umd_seq)
);

create table address_svc_m.rel_jibun_info_month
(
	mgmt_num varchar(25) not null comment '관리번호',
	seq varchar(12) not null comment '일련번호',
	law_dong_cd varchar(10) null comment '법정동코드',
	sd_nm varchar(50) null comment '시도명',
	sgg_nm varchar(50) null comment '시군구명',
	law_umd_nm varchar(50) null comment '법정읍면동명',
	law_ri_nm varchar(50) null comment '법정리명',
	san_yn varchar(1) null comment '산여부',
	jb_main_num int(4) null comment '지번본번(번지)',
	jb_sub_num int(4) null comment '지번본번(호)',
	main_yn varchar(1) null comment '대표여부',
	update_rs_cd varchar(2) null comment '변경사유코드',
	primary key (mgmt_num, seq)
);

그런데.. 왜 5개냐?

 

있는 테이블은 4개인데..

 

월변동분에는 지번주소를 대표와 상세로 따로 나눠 들어가 있습니다.

 

이걸 왜 따로 했는지는 아직 잘 파악이 안되었는데.. (분명 같이 할 수 있는데요..)

 

아마, 신규주소를 만들고, 관리하는데 더욱 편하게 작업하려는 의도인것으로 보입니다.

 

이렇게 월변동분 데이터를 넣을 테이블까지 만들었으니 이젠 데이터를 넣어봐야겠죠?

 

제 소스를 공유해 드리긴 하는데, 아마 약간의 수정이 필요할겁니다. 파일 경로 같은거요. 스키마 이름도 다르실수 있구요.

LOAD DATA LOCAL INFILE '/home/mariadb/201912update_juso/utf8_지번_변동분.txt'
    REPLACE
    INTO TABLE address_svc_m.jibun_info_month
    FIELDS TERMINATED BY '|'
    OPTIONALLY ENCLOSED BY ''
    LINES TERMINATED BY '\n'
    (@mgmt_num,
     @seq,
     @law_dong_cd,
     @sd_nm,
     @sgg_nm,
     @law_umd_nm,
     @law_ri_nm,
     @san_yn,
     @jb_main_num,
     @jb_sub_num,
     @main_yn)
    SET
        mgmt_num = @mgmt_num,
        seq = @seq,
        law_dong_cd = @law_dong_cd,
        sd_nm = @sd_nm,
        sgg_nm = @sgg_nm,
        law_umd_nm = @law_umd_nm,
        law_ri_nm = @law_ri_nm,
        san_yn = @san_yn,
        jb_main_num = @jb_main_num,
        jb_sub_num = @jb_sub_num,
        main_yn = @main_yn;

LOAD DATA LOCAL INFILE '/home/mariadb/201912update_juso/utf8_부가정보_변동분.txt'
    REPLACE
    INTO TABLE address_svc_m.add_info_month
    FIELDS TERMINATED BY '|'
    OPTIONALLY ENCLOSED BY ''
    LINES TERMINATED BY '\n'
    (@mgmt_num,
     @adm_dong_cd,
     @adm_dong_nm,
     @zipcode,
     @zipcode_seq,
     @plent_dlvr_nm,
     @build_rgst_nm,
     @sgg_build_nm,
     @multi_unit_yn)
    SET
        mgmt_num = @mgmt_num,
        adm_dong_cd = @adm_dong_cd,
        adm_dong_nm = @adm_dong_nm,
        zipcode = @zipcode,
        zipcode_seq = @zipcode_seq,
        plent_dlvr_nm = @plent_dlvr_nm,
        build_rgst_nm = @build_rgst_nm,
        sgg_build_nm = @sgg_build_nm,
        multi_unit_yn = @multi_unit_yn;

LOAD DATA LOCAL INFILE '/home/mariadb/201912update_juso/utf8_주소_변동분.txt'
    REPLACE
    INTO TABLE address_svc_m.juso_info_month
    FIELDS TERMINATED BY '|'
    OPTIONALLY ENCLOSED BY ''
    LINES TERMINATED BY '\n'
    (@mgmt_num,
     @road_nm_cd,
     @umd_seq,
     @basement_yn,
     @build_main_num,
     @build_sub_num,
     @base_area_num,
     @update_type_cd,
     @anncmt_date,
     @orgn_road_nm_addr,
     @get_detail_addr_yn)
    SET
        mgmt_num = @mgmt_num,
        road_nm_cd = @road_nm_cd,
        umd_seq = @umd_seq,
        basement_yn = @basement_yn,
        build_main_num = @build_main_num,
        build_sub_num = @build_sub_num,
        base_area_num = @base_area_num,
        update_type_cd = @update_type_cd,
        anncmt_date = @anncmt_date,
        orgn_road_nm_addr = @orgn_road_nm_addr,
        get_detail_addr_yn = @get_detail_addr_yn
;

LOAD DATA LOCAL INFILE '/home/mariadb/201912update_juso/utf8_개선_도로명코드_변경분.txt'
    REPLACE
    INTO TABLE address_svc_m.road_cd_info_month
    FIELDS TERMINATED BY '|'
    OPTIONALLY ENCLOSED BY ''
    LINES TERMINATED BY '\n'
    (@road_nm_cd,
     @road_nm,
     @road_roma_nm,
     @umd_seq,
     @sd_nm,
     @sd_roma_nm,
     @sgg_nm,
     @sgg_roma_nm,
     @umd_nm,
     @umd_roma_nm,
     @umd_gb,
     @umd_cd,
     @use_yn,
     @update_rs_cd,
     @update_his_info,
     @anncmt_date,
     @erase_date)
    SET
        road_nm_cd = @road_nm_cd,
        umd_seq = @umd_seq,
        road_nm = @road_nm,
        road_roma_nm = @road_roma_nm,
        sd_nm = @sd_nm,
        sd_roma_nm = @sd_roma_nm,
        sgg_nm = @sgg_nm,
        sgg_roma_nm = @sgg_roma_nm,
        umd_nm = @umd_nm,
        umd_roma_nm = @umd_roma_nm,
        umd_gb = @umd_gb,
        umd_cd = @umd_cd,
        use_yn = @use_yn,
        update_rs_cd = @update_rs_cd,
        update_his_info = @update_his_info,
        anncmt_date = @anncmt_date,
        erase_date = @erase_date
;

LOAD DATA LOCAL INFILE '/home/mariadb/201912update_juso/utf8_관련지번_변동분.txt'
    REPLACE
    INTO TABLE address_svc_m.rel_jibun_info_month
    FIELDS TERMINATED BY '|'
    OPTIONALLY ENCLOSED BY ''
    LINES TERMINATED BY '\n'
    (@mgmt_num,
     @seq,
     @law_dong_cd,
     @sd_nm,
     @sgg_nm,
     @law_umd_nm,
     @law_ri_nm,
     @san_yn,
     @jb_main_num,
     @jb_sub_num,
     @main_yn,
     @update_rs_cd)
    SET
        mgmt_num = @mgmt_num,
        seq = @seq,
        law_dong_cd = @law_dong_cd,
        sd_nm = @sd_nm,
        sgg_nm = @sgg_nm,
        law_umd_nm = @law_umd_nm,
        law_ri_nm = @law_ri_nm,
        san_yn = @san_yn,
        jb_main_num = @jb_main_num,
        jb_sub_num = @jb_sub_num,
        main_yn = @main_yn,
        update_rs_cd = @update_rs_cd
;

 

더군다나, mariadb, mysql이 아니라 오라클이나 다른 DBMS를 쓰시는분들은 그 환경에 맞게 수정이 필요 하실 겁니다.

 

작업을 하시다가 막히시는 부분이 있으면 언제든지 문의 주시면 됩니다.

 

자, 이젠 데이터 까지 다 들어갔나요?

 

그러면 원래 주소DB는 월변동 업데이트중 틀어질수 있으니 백업을 해줍니다.

 

create table address_svc_m.bak_juso_info_m select * from address_svc_m.juso_info_m

이런식으로 간단하게 백업을 할 수 있습니다.

 

4개 테이블을 모두 백업 해주시고, 그 뒤는 이젠 SQL을 이용해서 각 테이블 월변동분 업데이트를 할겁니다.

 

신규는 새로 insert 하고, 변동분은 update 하겠죠. 그리고 삭제되는 주소는 delete를 할텐데..

 

저같은 경우는 없어지는 주소도 가지고 있어야 하기 때문에 삭제되는 주소를 delete 하지 않고, 주소의 키가 되는 mgmt_num 컬럼값 맨 앞에 "D"를 붙여 줄겁니다.

 

그럼 데이터를 가지고 있으면서도, 이게 삭제된 데이터라는걸 알 수 있겠죠?

 

그러기 위해선 기존에 있던 테이블에 있는 mgmt_num 길이를 기존 25에서 26으로 늘려줘야 합니다.

 

alter table address_svc_m.juso_info_m modify mgmt_num varchar(26)

뭐 이런식으로 컬럼을 modify 하시면 됩니다.

 

이렇게 까지 하면 월변동분을 적용 할 수 있는 준비가 되었습니다.

 

mariadb를 쓰시는게 아니신 분들은 아래 그림에 있는 활용가이드, 그리고 주소정보/지번정보/부가정보 현행화(월변동) 

를 참조 하시길 바랍니다.

 

저기 있는 SQL을 써도 되실겁니다. 만약 oracle을 쓰고 계시다면요.

 

그게아니라 저처럼 mariadb를 쓰시는분들은 제가 작성한 쿼리를 참고 하시고, 대신 아까도 말씀 드렸지만 삭제는 제가 하지 않고 update를 친다고 했죠. 삭제 하실분들은 따로 SQL을 작성하셔서 작업 하시면 됩니다.

 

월변동분을 적용하는 SQL은 아래와 같습니다.

/* #####신규 건 처리##### */
/* 주소 신규 */
INSERT INTO address_svc_m.juso_info_m (mgmt_num, road_nm_cd, umd_seq, basement_yn, build_main_num, build_sub_num,
                                       base_area_num, update_type_cd, anncmt_date, orgn_road_nm_addr,
                                       get_detail_addr_yn, aud_last_update, inf_flag, inf_ip_yearmonth)
select a.mgmt_num
     , a.road_nm_cd
     , a.umd_seq
     , a.basement_yn
     , a.build_main_num
     , a.build_sub_num
     , a.base_area_num
     , a.update_type_cd
     , a.anncmt_date
     , a.orgn_road_nm_addr
     , a.get_detail_addr_yn
     , now()
     , 'N'
     , '201912'
from address_svc_m.juso_info_month a
where update_type_cd = '31'
  and not exists(select 1 from address_svc_m.juso_info_m b where b.mgmt_num = a.mgmt_num)
;


/* 지번 신규 */
INSERT INTO address_svc_m.jibun_info_m (mgmt_num, seq, law_dong_cd, sd_nm, sgg_nm, law_umd_nm, law_ri_nm, san_yn,
                                        jb_main_num, jb_sub_num, main_yn, aud_last_update)
select b.mgmt_num,
       b.seq,
       b.law_dong_cd,
       b.sd_nm,
       b.sgg_nm,
       b.law_umd_nm,
       b.law_ri_nm,
       b.san_yn,
       b.jb_main_num,
       b.jb_sub_num,
       b.main_yn,
       now()
from address_svc_m.juso_info_month a,
     address_svc_m.jibun_info_month b
where a.update_type_cd = '31'
  and a.mgmt_num = b.mgmt_num
  and not exists(select 1 from address_svc_m.jibun_info_m c where c.mgmt_num = a.mgmt_num)
;

/* 부가정보 신규 */
insert into address_svc_m.add_info_m (mgmt_num, adm_dong_cd, adm_dong_nm, zipcode, zipcode_seq, plent_dlvr_nm,
                                      build_rgst_nm, sgg_build_nm, multi_unit_yn, aud_last_update)
select b.mgmt_num,
       b.adm_dong_cd,
       b.adm_dong_nm,
       b.zipcode,
       b.zipcode_seq,
       b.plent_dlvr_nm,
       b.build_rgst_nm,
       b.sgg_build_nm,
       b.multi_unit_yn,
       now()
from address_svc_m.juso_info_month a,
     address_svc_m.add_info_month b
where a.update_type_cd = '31'
  and a.mgmt_num = b.mgmt_num
  and not exists(select 1 from address_svc_m.add_info_m c where c.mgmt_num = a.mgmt_num)
;

/* 도로명코드 신규 */
insert into address_svc_m.road_cd_info_m (road_nm_cd, umd_seq, road_nm, road_roma_nm, sd_nm, sd_roma_nm, sgg_nm,
                                          sgg_roma_nm, umd_nm, umd_roma_nm, umd_gb, umd_cd, use_yn, update_rs_cd,
                                          update_his_info, anncmt_date, erase_date, aud_last_update)
select a.road_nm_cd,
       a.umd_seq,
       a.road_nm,
       a.road_roma_nm,
       a.sd_nm,
       a.sd_roma_nm,
       a.sgg_nm,
       a.sgg_roma_nm,
       a.umd_nm,
       a.umd_roma_nm,
       a.umd_gb,
       a.umd_cd,
       a.use_yn,
       a.update_rs_cd,
       a.update_his_info,
       a.anncmt_date,
       a.erase_date,
       now()
from address_svc_m.road_cd_info_month a
where not exists(select 1
                 from address_svc_m.road_cd_info_m b
                 where a.road_nm_cd = b.road_nm_cd
                   and a.umd_seq = b.umd_seq)
;



/* #####변경 건 처리##### */
/* 주소 변경 */
update address_svc_m.juso_info_m a
    left outer join (select mgmt_num,
                            road_nm_cd,
                            umd_seq,
                            basement_yn,
                            build_main_num,
                            build_sub_num,
                            base_area_num,
                            update_type_cd,
                            anncmt_date,
                            orgn_road_nm_addr,
                            get_detail_addr_yn,
                            now(),
                            'N'
                     from address_svc_m.juso_info_month
                     where update_type_cd = '34') b
    on a.mgmt_num = b.mgmt_num
set a.mgmt_num           = b.mgmt_num,
    a.road_nm_cd         = b.road_nm_cd,
    a.umd_seq            = b.umd_seq,
    a.basement_yn        = b.basement_yn,
    a.build_main_num     = b.build_main_num,
    a.build_sub_num      = b.build_sub_num,
    a.base_area_num      = b.base_area_num,
    a.update_type_cd     = b.update_type_cd,
    a.anncmt_date        = b.anncmt_date,
    a.orgn_road_nm_addr  = b.orgn_road_nm_addr,
    a.get_detail_addr_yn = b.get_detail_addr_yn,
    a.aud_last_update    = now(),
    a.inf_flag           = 'N'
where b.mgmt_num is not null
;


/* 지번 변경 */
update address_svc_m.jibun_info_m a
    left outer join (select c.*
                     from address_svc_m.juso_info_month b,
                          address_svc_m.jibun_info_month c
                     where b.mgmt_num = c.mgmt_num
                       and b.update_type_cd = '51') d
    on a.mgmt_num = d.mgmt_num
        and a.seq = d.seq
set a.mgmt_num        = d.mgmt_num,
    a.seq             = d.seq,
    a.law_dong_cd     = d.law_dong_cd,
    a.sd_nm           = d.sd_nm,
    a.sgg_nm          = d.sgg_nm,
    a.law_umd_nm      = d.law_umd_nm,
    a.law_ri_nm       = d.law_ri_nm,
    a.san_yn          = d.san_yn,
    a.jb_main_num     = d.jb_main_num,
    a.jb_sub_num      = d.jb_sub_num,
    a.main_yn         = d.main_yn,
    a.aud_last_update = now()
where d.mgmt_num is not null
;

/* 우편번호 변경 */
update address_svc_m.add_info_m a
    left outer join (select c.zipcode, c.mgmt_num
                     from address_svc_m.juso_info_month b,
                          address_svc_m.add_info_month c
                     where b.mgmt_num = c.mgmt_num
                       and b.update_type_cd = '70') d
    on a.mgmt_num = d.mgmt_num
set a.zipcode = d.zipcode
where d.mgmt_num is not null
;

/* 건물명 변경 */
update address_svc_m.add_info_m a
    left outer join (select c.build_rgst_nm, c.sgg_build_nm, c.mgmt_num
                     from address_svc_m.juso_info_month b,
                          address_svc_m.add_info_month c
                     where b.mgmt_num = c.mgmt_num
                       and b.update_type_cd = '71') d
    on a.mgmt_num = d.mgmt_num
set a.build_rgst_nm = d.build_rgst_nm,
    a.sgg_build_nm  = d.sgg_build_nm
where d.mgmt_num is not null
;

/* 기타부가정보 변경 */
update address_svc_m.add_info_m a
    left outer join (select c.adm_dong_cd, c.adm_dong_nm, c.multi_unit_yn, c.mgmt_num
                     from address_svc_m.juso_info_month b,
                          address_svc_m.add_info_month c
                     where b.mgmt_num = c.mgmt_num
                       and b.update_type_cd = '79') d
    on a.mgmt_num = d.mgmt_num
set a.adm_dong_cd   = d.adm_dong_cd,
    a.adm_dong_nm   = d.adm_dong_nm,
    a.multi_unit_yn = d.multi_unit_yn
where d.mgmt_num is not null
;

/* 폐지 건 처리 */
/* 주소정보 폐지 */
update address_svc_m.juso_info_m a
    left outer join (select mgmt_num
                     from address_svc_m.juso_info_month
                     where update_type_cd = '63') b
    on a.mgmt_num = b.mgmt_num
set a.mgmt_num = concat('D', b.mgmt_num)
where b.mgmt_num is not null
;

/* 지번정보 폐지 */
update address_svc_m.jibun_info_m a
    left outer join (select mgmt_num
                     from address_svc_m.juso_info_month
                     where update_type_cd = '63') b
    on a.mgmt_num = b.mgmt_num
set a.mgmt_num = concat('D', b.mgmt_num)
where b.mgmt_num is not null
;

/* 부가정보 폐지 */
update address_svc_m.add_info_m a
    left outer join (select mgmt_num
                     from address_svc_m.juso_info_month
                     where update_type_cd = '63') b
    on a.mgmt_num = b.mgmt_num
set a.mgmt_num = concat('D', b.mgmt_num)
where b.mgmt_num is not null
;

/* 관련지번 변경 처리  */
/* 관련지번 신규 */
INSERT INTO address_svc_m.jibun_info_m (mgmt_num, seq, law_dong_cd, sd_nm, sgg_nm, law_umd_nm, law_ri_nm, san_yn,
                                        jb_main_num, jb_sub_num, main_yn, aud_last_update)
select a.mgmt_num,
       a.seq,
       a.law_dong_cd,
       a.sd_nm,
       a.sgg_nm,
       a.law_umd_nm,
       a.law_ri_nm,
       a.san_yn,
       a.jb_main_num,
       a.jb_sub_num,
       a.main_yn,
       now()
from address_svc_m.rel_jibun_info_month a
where a.update_rs_cd in ('31', '34')
  and not exists(select 1 from address_svc_m.jibun_info_m b where a.mgmt_num = b.mgmt_num and a.seq = b.seq)
;

/* 관련지번 변경 */
update address_svc_m.jibun_info_m a
    left outer join (select b.*
                     from address_svc_m.rel_jibun_info_month b
                     where b.update_rs_cd in ('31', '34')
                       and exists(select 1
                                  from address_svc_m.jibun_info_m c
                                  where c.mgmt_num = b.mgmt_num
                                    and c.seq = b.seq)) d
    on a.mgmt_num = d.mgmt_num
        and a.seq = d.seq
set a.mgmt_num        = d.mgmt_num,
    a.seq             = d.seq,
    a.law_dong_cd     = d.law_dong_cd,
    a.sd_nm           = d.sd_nm,
    a.sgg_nm          = d.sgg_nm,
    a.law_umd_nm      = d.law_umd_nm,
    a.law_ri_nm       = d.law_ri_nm,
    a.san_yn          = d.san_yn,
    a.jb_main_num     = d.jb_main_num,
    a.jb_sub_num      = d.jb_sub_num,
    a.main_yn         = d.main_yn,
    a.aud_last_update = now()
where d.mgmt_num is not null
;

/* 관련지번 폐지 */
delete
from address_svc_m.jibun_info_m
where concat(mgmt_num, '_', seq) in
      (select *
       from (
                select concat(b.mgmt_num, '_', b.seq)
                from address_svc_m.rel_jibun_info_month b,
                     address_svc_m.jibun_info_m c
                where b.mgmt_num = c.mgmt_num
                  and b.seq = c.seq
                  and b.update_rs_cd = '63') sc)
;
update address_svc_m.road_cd_info_m a
    left outer join (select b.*
                     from address_svc_m.road_cd_info_month b
                     where exists(select 1
                                  from address_svc_m.road_cd_info_m c
                                  where b.road_nm_cd = c.road_nm_cd
                                    and b.umd_seq = c.umd_seq)) d
    on a.road_nm_cd = d.road_nm_cd
        and a.umd_seq = d.umd_seq
set a.road_nm_cd      = d.road_nm_cd,
    a.umd_seq         = d.umd_seq,
    a.road_nm         = d.road_nm,
    a.road_roma_nm    = d.road_roma_nm,
    a.sd_nm           = d.sd_nm,
    a.sd_roma_nm      = d.sd_roma_nm,
    a.sgg_nm          = d.sgg_nm,
    a.sgg_roma_nm     = d.sgg_roma_nm,
    a.umd_nm          = d.umd_nm,
    a.umd_roma_nm     = d.umd_roma_nm,
    a.umd_gb          = d.umd_gb,
    a.umd_cd          = d.umd_cd,
    a.use_yn          = d.use_yn,
    a.update_rs_cd    = d.update_rs_cd,
    a.update_his_info = d.update_his_info,
    a.anncmt_date     = d.anncmt_date,
    a.erase_date      = d.erase_date,
    a.aud_last_update = now()
where d.road_nm_cd is not null
;

위 SQL을 참고 하셔서 월변동분 잘 적용 하시길 바랍니다.

 

더불어 혹시 SQL 오류를 발견하시거나, 문의 사항이 있으시면 꼭 댓글 부탁드리겠습니다.

 

제가 적용해본바로는 아직 오류가 있진 않은데.. 혹시라도..ㅎㅎ

 

다음편엔 이젠 주소DB를 활용한 파이썬 데이터 분석을 우리 주소DB로 한번 진행해 보겠습니다.

 

여러분들의 격려가 저에겐 큰 힘이 됩니다!

 

오늘도 좋은 하루 되시길 바랍니다 여러분!

 

감사합니다!!!

 

 

 

by.sTricky