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