Welcome

首页 / 数据库 / SQLServer / 如何使用Sql Server 2008 Hierarchyid字段类型构造树型分类表

如何使用Sql Server 2008 Hierarchyid字段类型构造树型分类表2014-08-08利用数据库表构造无限级分类,通常我们会采用下面这种方式

这种主子关系结构清晰,但查询时会有一些小问题;查询当前类别的所有子类及子类下的子孙类,会出现递归查询,而实际应用中这种查询是很常见的,比如我们要查询所有技术类文章信息;

解决这类问题在SqlServer2005出现之前通常是采用游标来操作,但熟悉数据库内部机制的人都知道使用游标带来的性能问题和其他问题是比较严重的

到了SqlServer2005下,可以选择用CTE来做递归查询,例如要查询所有技术类文章,就可使用这种方式,向上递归和向下递归基本实现方式是基本一致的

/*查询所有"技术类文章"类别及其子孙类*/

WITH T_Category(id,name,parentid) as

SELECT CategoryID,CategoryName,ParentId FROM Category WHERE CategoryID=3

UNION ALL

SELECT A.CategoryID,A.CategoryName, A.ParentID FROM Category A ,T_Category B where A.ParentId=B.id

SELECT * FROM T_Category

这种方式查询比较简练,但由于数据库内部是采用递归查询的方式,其效率依旧不高;

为了能够实现既简练又高效的查询,通常的做法是增加冗余字段,比如增加一个"Path"字段:

查询时用模糊查询来进行左匹配,如查询所有文章类别时这样写, Select * from SiteCategory where path like ‘文章%"

对Path建索引后,这种查询的效率还是相当高的,因此这种方式也是一种常规的设计方式;

下面介绍另一种设计方式,利用SqlServer2008中的Hierarchyid字段类型来构造这种结构;

创建一客户地区信息表“Customer”,结构如下