王朝网络
分享
 
 
 

行政区划数据数据库的设计(七)

王朝other·作者佚名  2006-09-27
宽屏版  字体: |||超大  

Author:水如烟

行政区划数据数据库的设计(六)

上文实现了把区划码按三个行政级别分成了六个类,分别是:

一级:省

二级:省直辖市、地区州盟

三级:市地辖区、县旗、省直辖县级市

至于这样的命名和分级对不对,我心里也没准,不过修改还是方便的,到时知错了改正就是了。

现在继续说附属部分的全名。

单单给出了区划码和名称,如:654221 额敏县,我们看着也只有干着急的份。需要更多的信息。如是654221 新疆维吾尔自治区塔城地区额敏县,这才是我们需要的,看着也乐意。

全名无非是由省+市+县的名称组成,也就是一级名称+二级名称+三级名称,这是约定俗成的,不知也有相关规定没有,这回我没有去找(应当已有国家标准规定)。

这个定义我可以用函数固定下来了:

[Action].全名

USE [RegionalCodeWorks]

GO

/****** 对象: UserDefinedFunction [Action].[全名] 脚本日期: 09/21/2006 17:55:00 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author: LzmTW

-- Create date: 20060921

-- Description: 取行政区全名

--=============================================

CREATE FUNCTION [Action].[全名]

(

@当前时间 [Base].[RegionalDate] = N'Current'

,@一级 nchar(2)

,@二级 nchar(2)

,@三级 nchar(2)

)

RETURNS nvarchar(200)

AS

BEGIN

--初始化变量

DECLARE @全名 nvarchar(200)

,@一级全名 nvarchar(100)

,@二级全名 nvarchar(100)

,@三级全名 nvarchar(100)

SET @一级全名 = N''

SET @二级全名 = N''

SET @三级全名 = N''

DECLARE @一级区划码 [Base].RegionalCode

,@二级区划码 [Base].RegionalCode

,@当前区划码 [Base].RegionalCode

SET @一级区划码 = @一级 + N'00' + N'00'

SET @二级区划码 = @一级 + @二级 + N'00'

SET @当前区划码 = @一级 + @二级 + @三级

--分三种情形取全名

IF @当前区划码 = @一级区划码

SELECT @一级全名 = 名称

FROM [Action].[行政区情况](@当前时间)

WHERE 区划码 = @当前区划码

ELSE

IF @当前区划码 = @二级区划码

BEGIN

SELECT @一级全名 = 名称

FROM [Action].[行政区情况](@当前时间)

WHERE 区划码 = @一级区划码

SELECT @二级全名 = 名称

FROM [Action].[行政区情况](@当前时间)

WHERE 区划码 = @当前区划码

END

ELSE

BEGIN

SELECT @一级全名 = 名称

FROM [Action].[行政区情况](@当前时间)

WHERE 区划码 = @一级区划码

SELECT @二级全名 = 名称

FROM [Action].[行政区情况](@当前时间)

WHERE 区划码 = @二级区划码

SELECT @三级全名 = 名称

FROM [Action].[行政区情况](@当前时间)

WHERE 区划码 = @当前区划码

END

SET @全名 = @一级全名

+ @二级全名

+ @三级全名

RETURN @全名

END

现在我们可以看看结果,在ManageMent上运行:

USE [RegionalCodeWorks]

GO

SELECT *

,[Action].全名(DEFAULT, 一级, 二级, 三级) AS 全名

FROM [Action].[行政区情况] (DEFAULT)

存在如下一些结果是需要重新处理这个函数的:

2 110100 市辖区 11 01 00 Current 20020331 北京市市辖区

3 110101 东城区 11 01 01 Current 20020331 北京市市辖区东城区

19 110200 县 11 02 00 Current 20020331 北京市县

20 110228 密云县 11 02 28 Current 20020331 北京市县密云县

以下我对二级名称重新作了处理:

凡二级名称是“市辖区”、“市”、“县”的,都不取。

USE [RegionalCodeWorks]

GO

/****** 对象: UserDefinedFunction [Action].[全名] 脚本日期: 09/21/2006 18:38:36 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author: LzmTW

-- Create date: 20060921

-- Description: 取行政区的全名

-- =============================================

CREATE FUNCTION [Action].[全名]

(

@当前时间 [Base].[RegionalDate] = N'Current'

,@一级 nchar(2)

,@二级 nchar(2)

,@三级 nchar(2)

)

RETURNS nvarchar(200)

AS

BEGIN

--初始化变量

DECLARE @全名 nvarchar(200)

,@一级名称 nvarchar(100)

,@二级名称 nvarchar(100)

,@三级名称 nvarchar(100)

SET @一级名称 = N''

SET @二级名称 = N''

SET @三级名称 = N''

DECLARE @一级区划码 [Base].RegionalCode

,@二级区划码 [Base].RegionalCode

,@当前区划码 [Base].RegionalCode

SET @一级区划码 = @一级 + N'00' + N'00'

SET @二级区划码 = @一级 + @二级 + N'00'

SET @当前区划码 = @一级 + @二级 + @三级

--分三种情形取全名

IF @当前区划码 = @一级区划码

SELECT @一级名称 = 名称

FROM [Action].[行政区情况](@当前时间)

WHERE 区划码 = @当前区划码

ELSE

IF @当前区划码 = @二级区划码

BEGIN

SELECT @一级名称 = 名称

FROM [Action].[行政区情况](@当前时间)

WHERE 区划码 = @一级区划码

SELECT @二级名称 = 名称

FROM [Action].[行政区情况](@当前时间)

WHERE 区划码 = @当前区划码

END

ELSE

BEGIN

SELECT @一级名称 = 名称

FROM [Action].[行政区情况](@当前时间)

WHERE 区划码 = @一级区划码

SELECT @二级名称 = 名称

FROM [Action].[行政区情况](@当前时间)

WHERE 区划码 = @二级区划码

SELECT @三级名称 = 名称

FROM [Action].[行政区情况](@当前时间)

WHERE 区划码 = @当前区划码

END

IF @二级名称 IN(N'市辖区', N'市', N'县')

SET @二级名称 = N''

SET @全名 = @一级名称

+ @二级名称

+ @三级名称

RETURN @全名

END

我将上面的X级全名改成了X级名称,这符实际。

最后,建一个存储过程,将可能需要用到的所有信息都输送出去:

USE [RegionalCodeWorks]

GO

/****** 对象: StoredProcedure [Program].[行政区情况] 脚本日期: 09/21/2006 18:27:01 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author: LzmTW

-- Create date: 20060921

-- Description: 取行政区划的所有信息

-- =============================================

CREATE PROCEDURE [Program].[行政区情况]

@当前时间 [Base].[RegionalDate] = N'Current'

AS

BEGIN

SET NOCOUNT ON;

DECLARE @类型情况 TABLE

(

区划码ID smallint

,类型ID smallint

)

INSERT INTO @类型情况

EXEC [Action].[区划码类型情况] @当前时间

SELECT TOP 100 PERCENT

d.区划码ID

,d.区划码

,d.名称

,[Action].全名(@当前时间, d.一级, d.二级, d.三级) AS 全名

,a.类型

,b.级别

,d.一级

,d.二级

,d.三级

,d.截止日期

,d.起始日期

,a.类型ID

,b.级别ID

FROM Base.行政区类型 AS a

INNER JOIN Base.行政区级别 AS b

ON a.级别ID = b.级别ID

INNER JOIN @类型情况 AS c

ON a.类型ID = c.类型ID

INNER JOIN [Action].行政区情况(@当前时间) AS d

ON d.区划码ID = c.区划码ID

ORDER BY d.一级, d.二级, d.三级

END

这个数据库我觉得内容有意义,做为练习再好不过了。

若想得到更多的信息,比如历年数据对比,比如看看那些增加了换名了,看看城市化进程情况,也比如做做交叉表,等等,以后再练习。

下一文,再回到程序,实现简单的查询。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有