製做一套適用於Oracle數據庫的縣及縣以上行政區劃數據

由於項目中要用到最新版的中國行政區劃數據,我總結了以下方法歸集數據,僅供參考。sql

以前已經寫過一篇博客《總結幾個有關國家行政區劃的問題》(https://my.oschina.net/Tsybius2014/blog/757009),對一些與行政區劃有關的問題進行了初步的梳理,本文要實現的目標是:獲取國家行政區劃數據並將之導入到Oracle數據中。數據庫

首先獲取的數據必定要從權威渠道獲取,網上找來的不少數據都是幾年前的數據,而國家的行政區劃每一年都有變化。通過對歷年縣級及以上行政區劃的變化進行分析,雖然變動的實際狀況多種多樣,但任何種類變化均可用如下三類原子變化表示 :區域新設、區域撤銷、區域改名。工具

國家行政區劃數據可從國家統計局官網獲取,地址爲:http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/.net

本文選取發佈時間最近的版本,該版本於2016年8月9日發佈,區劃數據爲2015年9月30日的全國縣級及以上行政區劃數據。code

將這些數據複製到文本文件area_data.txt中,用文本編輯工具editplus打開:blog

有一點須要注意,歷年數據雖然在網頁上看起來格式是同樣的,但從實際粘貼效果來看,不一樣年的數據對空行、空格字符(全角空格、半角空格、製表符)等字符的使用可能有所不一樣,所以每次操做都須要具體問題具體分析。文檔

本次處理,咱們須要進行以下替換:將製表符和全角空格字符都替換爲半角空格get

將這些數據粘貼到Excel文檔area_data.xlsx中,我使用的Office版本爲Office2010:博客

下一步是要刪除數據表中的偶數行,方法是在最左側新加一列A ,並將A列的公式設定爲「=MOD(ROW(),2)」it

而後設置過濾器,點擊「工具→篩選」,將A列爲0的數據都過濾出來,而後一併刪掉。事畢以後將用於篩選的A列刪除。

再給本身定一個小目標,如今的A列顯示的內容爲「110000      北京市」,咱們要將它放到兩列中。

選中A列,找到「數據→分列」。

嚮導一共分三步,第一步按默認選中分割符號。

第二步,除了Tab鍵外,還應勾選空格。

第三步,必定要選擇「文本」,不然後續執行含VLOOKUP的公式時會出現錯誤,還須要從新作文本分列。

分列後的數據以下,注意A列左上角會出現綠色的小三角。

後面須要使用四個公式,將C、D、E、F四列分別計算爲省、市、縣、省.市.縣

如下公式都供第一行使用,須要經過拉動單元格右下角擴展到後續行:

一、計算省,使用公式:=VLOOKUP(LEFT(A1,2)&"0000",$A$1:$B$3514,2,FALSE)

二、計算市,使用公式:=IF(RIGHT(A1,4)="0000","",VLOOKUP(LEFT(A1,4)&"00",$A$1:$B$3514,2,FALSE))

三、計算縣,使用公式:=IF(RIGHT(A1,2)="00","",VLOOKUP(A1,$A$1:$B$3514,2,FALSE))

四、計算省.市.縣,使用公式:=CONCATENATE(C1,IF(D1="","","."&D1),IF(E1="","","."&E1))

如今咱們須要將A列與F列的對應關係導入到Oracle數據庫中的一張表裏,假定咱們要將數據導入到表AREA_INFO_NEW中,此表結構以下:

CREATE TABLE AREA_INFO_NEW
(
    AREA_CODE VARCHAR(20),
    AREA_NAME VARCHAR(100)
);

在最上方添加一行,A列地區碼填寫AREA_CODE,F列地區名稱填寫AREA_NAME,注意若是表格最後有冗餘的空行,要予以刪除,不然此行也會被導入到數據庫中。

我使用的Oracle版本爲Oracle11g,plsql客戶端版本爲7.0.1.1066。

用戶/系統DSN選擇「ExcelFiles」,用戶名和密碼輸入Oracle用戶登陸名和密碼便可。

點擊鏈接後,找到要導入的Excel表。

在「來自ODBC的數據」選項卡下,設置「導入表」並指定表爲Sheet1,即咱們剛纔操做Excel時使用的Sheet頁。

在「到Oracle的數據」選項卡下,設置全部者、表名,並選擇字段的對應關係,同名字段可創建默認的關聯關係(AREA_CODE和AREA_NAME)。

點擊最下方的「導入」按鈕開始導入。

導入完畢後,plsql會告知導入的記錄數和導入總時長。

此時可驗證行政區劃數據已被盡數導入到數據庫中。

最後再列出三個SQL語句,當兩張表有不一樣的行政區劃數據時,可用於作數據對比。(如行政區劃新舊數據的替換,有時就須要研究清楚數據的增減變化)

設老數據保存在表AREA_INFO_OLD中,該表結構與AREA_INFO_NEW一致。

一、查詢新設的行政區劃

SELECT NEW.AREA_CODE, NEW.AREA_NAME
FROM   AREA_INFO_NEW NEW
WHERE  NEW.AREA_CODE NOT IN (SELECT OLD.AREA_CODE
                             FROM   AREA_INFO_OLD OLD
                             WHERE  OLD.AREA_CODE = NEW.AREA_CODE)
ORDER  BY NEW.AREA_CODE;

二、查詢撤銷的行政區劃

SELECT OLD.AREA_CODE, OLD.AREA_NAME
FROM   AREA_INFO_OLD OLD
WHERE  OLD.AREA_CODE NOT IN (SELECT NEW.AREA_CODE
                             FROM   AREA_INFO_NEW NEW
                             WHERE  OLD.AREA_CODE = NEW.AREA_CODE)
ORDER  BY OLD.AREA_CODE;

三、查詢改名的行政區劃

SELECT OLD.AREA_CODE, OLD.AREA_NAME AS OLD_NAME, NEW.AREA_NAME AS NEW_NAME
FROM   AREA_INFO_OLD OLD, AREA_INFO_NEW NEW
WHERE  OLD.AREA_CODE = NEW.AREA_CODE AND
       OLD.AREA_NAME <> NEW.AREA_NAME
ORDER  BY OLD.AREA_CODE;

END

相關文章
相關標籤/搜索