首页 ┆ 网站地图 ┆ 在线留言 ┆ 游戏资讯 ┆ 资源下载 ┆ 端午节祝福 ┆ 迅雷在线影视 ┆淘宝手机在线充值 ┆淘宝游戏点卡充值 
设为首页
加入收藏
联系我们
高级搜索
您当前的位置: 主页>数据库>SQL数据库>SQL数据库如何存储层级数据实现无限级分类算法
SQL数据库如何存储层级数据实现无限级分类算法
来源: 发布时间:2008-11-25 发布人: 浏览: 人次   字体: [ ]  

    最近正在做的一个项目需要实现快速展现分层的数据,MYSQL 的开发者帮我们想到了一个算法,这个算法目前唯一的问题就是尚未实现分类排序,我们可以通过右值的反向排序实现先入先出的排序。在这里我们需要了解的是如何用SQL Server 来实现,我们就以省市县数据库为例来实现:

如图所示我们将一个树节点的左右各编上号码,就可以看出一些规律,山西的左右值为(8,17),那么所有左值大于8,右值小于17的节点都是属于山西的子节点。稷山先的左右值为(14,15),那么他的所有父节点就是左值小于14,右值大于15的节点,怎么样,用这个方法实现的无限级分类性能绝对是顶呱呱的。一次查询就可以查出属于某个节点的数据以及他子节点的数据。这个算是我见过性能最高的无限级分类算法。其他算法跟这个对比基本没有任何优势。
我们先建立一个数据表,结构如下图(LID 为左值,RID 为右值,Tree 为节点深度,Name 和 ID 就不多说了,节点的索引和名称)

我们可以使用下面的存储过程来获得一个节点和其子节点:
CREATE PROCEDURE CLSP_ZoneSelect

(   @Root INT,
  @Tree INT )
AS   SELECT Z.ID,Z.Tree,Z.Name
  FROM CL_ZoneData AS Z,CL_ZoneData AS P   WHERE   P.ID = @Root
        AND Z.LID >= P.LID AND Z.RID <= P.RID         AND (@Tree = 0 OR Z.Tree <= P.Tree + @Tree)
  ORDER BY Z.LID ASC GO

我们可以用下面这个存储过程来在一个节点下插入新的子节点:
CREATE PROCEDURE CLSP_ZoneInsert
(   @Root INT,
  @Name NVARCHAR(50) )
AS   DECLARE @RID AS INT,@NID AS INT,@Tree AS INT
  SET @RID = 1
  SET @NID = 0   SET @Tree = 1
  IF @Root = 0
  BEGIN     SELECT TOP 1 @RID = RID + 1
    FROM CL_CateData ORDER BY RID DESC   END
  ELSE   BEGIN
    SELECT @RID = RID, @Tree = Tree + 1     FROM CL_ZoneData WHERE ID = @Root
  END
  IF @Root = 0 OR @RID > 1   BEGIN
    UPDATE CL_ZoneData SET RID = RID + 2 WHERE RID >= @RID     UPDATE CL_ZoneData SET LID = LID + 2 WHERE LID > @RID
    INSERT INTO CL_ZoneData(LID,RID,Tree,Name)
    VALUES (@RID,@RID + 1,@Tree,@Name)
    SET @NID = SCOPE_IDENTITY()   END
  SELECT @NID GO

删除一个节点可以用下面的存储过程:
CREATE PROCEDURE CLSP_ZoneDelete
(   @ID INT
)   AS
  DECLARE @LID AS INT, @RID AS INT, @WID AS INT, @DID AS INT   SET @DID = 0
  SELECT @DID = ID, @LID = LID, @RID = RID, @WID = RID - LID + 1 FROM CL_ZoneData WHERE ID = @ID   IF @DID != 0
  BEGIN     DELETE FROM CL_ZoneData WHERE LID BETWEEN @LID AND @RID
    UPDATE CL_ZoneData SET RID = RID - @WID WHERE RID > @RID     UPDATE CL_ZoneData SET LID = LID - @WID WHERE LID > @RID
  END   SELECT @DID
GO


相 关 文 章   发布商链接
·sql语句写行转列的代码遇到无法处理...
·浅谈sql2008新增的四个有关日期时间...
·在win2003安装Sql2005提示登录失败的...
·sql获取字符串中的字母和数字函数
·sql2005数据库被置疑后的解决方案
·SQL查询条件中有转义符的解决办法
·分析sql2005数据库中二进制数据的存...
·SQL数据库实现拆分字符串的三种方法
·sql2005实现获取第n行数据的代码
·另类利用Sql语句随机提取数据,可提...
 §最新评论:(评论内容只代表网友观点,与本站立场无关!)
网名: 验证码:  【所有评论】【↑返回顶部
评 分: 12 345
评论内容:(不能超过500字,请自觉遵守互联网相关政策法规。[按 Ctrl+Enter 可直接提交]
注意:请勿在本站发布政治话题、色情及违反法律的内容。
IT知道网 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。
推 荐 文 章
·SQL数据库实现用SQL语句根据...
·SqlServer 2005 Express的配...
·sql排序规则的简介及其修改操
·如何用sql语句为字段添加和去
·sqlserver数据库日志文件压缩
·sql语句获得数据库某表字段的
·ISNUMERIC函数介绍及其要注意
·SQLServer2005导入xml文件实...
·SQL Server2005中删除表中重...
·如何手工启动SQLServer的全文
·sql删除数据库中的所有表语句
·SqlServr利用触发器来控制某...
·SQLServer常用日期格式转换方
·用sql实现查询重复记录的代码
·SQLServer2005分解导入xml文...
热 门 文 章
·图解SQL2008安装向导的使用
·实现Excel数据导入到SQL2005...
·SQLServer常用日期格式转换方...
·MS sql安装时“无法在COM+目...
·sql语句联合删除多个表技巧
·sql删除数据库中的所有表语句
·Sql Server端口连接的问题
·如何在SQL Server中得到自动...
·sql排序规则的简介及其修改操...
·SQL Server2005中删除表中重...
·分析SQL2005最新高效分页方法
·小解sqlServer中临时表及表变...
·用sql实现查询重复记录的代码
·MS SQL2005无法远程连接问题...
·如何修改sqlserver数据库名称
网站首页 - 关于本站 - 加入收藏 - 网站地图 - 友情连接 - 在线留言 - 联系我们 - 返回顶部
Copyright © 2007 IT知道网.[冀ICP备07026896号]. All Rights Reserved .