制做一套适用于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

相关文章
相关标签/搜索