sqlite 한개의 DB안에 있는테이블을 조합해서 새로운테이블 생성

목록으로



as select 를 이용해서 select 결과를 이용해서 새로운 만들기.

* 목표

주소관련 DB 에서 우편번호,행정동,건물이름 ..등등을 담고 았는 buga 테이블이 있는데.

이 테이블의 레코드 수는 6백만개가 넘는다.

그런데 건물이름이 있는 레코드는 몇개가 안된다.

동명과 건물이름으로 주소를 검색할때 6백만개의 레코드에서 검색하는 것은 비효율적이다.

 

- buga 테이블에서 건물이름이 있는 레코드만 추출해서 따로 bugabdbname 라는 테이블을 만들기

- 그런데 buga 테이블에는 행정동만 있다.

사람들은 법정동, 행정동 이런거 잘 모른다.

그래서 행정동 외에 법정동도 새로 만든 테이블 에 추가하고 법정동이든 행정동이든 아무거나

입력하면 찿게 하고 싶다.

 

bugabdname 테이블을 만드는 sql문이 아래의 완성된 형태.

이렇게 만든어진 레코드수는 1만8천개. 6백만개에서 검색하는 것보다 1만8천개에서 검색하는

당연히 빠르다.

 

* 쿼리문

import sqlite3
con = sqlite3.connect( "전국.db"  )
sql = '''
CREATE TABLE IF NOT EXISTS bugabdname AS SELECT
 t1.GRNo, t1.HJDName as HJDName, t1.SGHBuildName as SGHBuildName,
(SELECT CASE WHEN LENGTH(t2.BJReName)=0 THEN t2.BJUMDName ELSE t2.BJReName END) AS BJUMDName
 FROM buga t1 INNER JOIN jibun t2 ON t1.GRNo = t2.GRNo WHERE NOT LENGTH(t1.SGHBuildName)=0
;'''
con.execute(sql)
con.commit()
con.close()

 

 

* 쿼리 분석.

1. 테이블이 존재하지 않으면 새로 만드는데 as select 를 이용해서 select 결과를 이용해서 만든다.

2. 새로 만드는 테이블은 table 2개를 이용해서 생성한다.

   필드의 선택은 buga 테이블에서 필요한 레코드를 가져오고 jibun 테이블에서는 case when 문을

   이용해서 LENGTH(t2.BJReName)=0 이면 즉 BJReName 필드값이 없으면 BJUMDName 를

   가져오고 있으면 BJUMDName 값을 가져온다.

   이때 반드시 as문을 써서 새로 생성될 테이블의 필드명을 기입해 한다.( AS BJUMDName )

3. 가져올 테이블의 선택은 두개의 테이블의 키값(GRNo)이

   같은것을 INNER JOIN (교집합)으로 연결해서 만드는데 건물이름이 있는것만 가져온다.

   NOT LENGTH(t1.SGHBuildName)=0



수정일
25-02-05 10:27
관리자
25-02-05 10:26
댓글 추가 ..
0 개의 답변이 있습니다.
Sqlite 이론


10 sqlite 여러개 다른파일 DB 조합해서 새로운 DB만들기 관리자 38 2025-02-05
9 sqlite 한개의 DB안에 있는테이블을 조합해서 새로운테이블 생성 관리자 36 2025-02-05
8 sqlite DB내의 필드이름, 테이블 목록 알아보기 관리자 36 2025-02-05