精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-06-18
TO 抛出异常的爱 :你那方法不行,可能我没表达清楚吧...你看看我上传的图吧
|
|
返回顶楼 | |
发表时间:2007-06-18
汗。。。。
这个你不写成程序么,我的SQL知识。。。。 用存储过程的话, 先用前一个ID select出后一级的子菜单。。 之后遍历子菜单。。。、 每次遍历把游标放入一个 临时表, 直到完成。。。。(不知道sql能否递归,如不能请用递推来写) |
|
返回顶楼 | |
发表时间:2007-06-18
有谁能不能说具体的实现!~~现在如果光排序的那没问题,但是各节点之间不是有顺序的吗??这个顺序是可以改的..现在主要问题是如果要改这个的话就比较麻烦了..比如有两个父节点顺序是23和38 现在把23这个改成39的话..那23下面的所有子节点都要修改..
这个好象比较麻烦,要么是我设计的问题??? |
|
返回顶楼 | |
发表时间:2007-06-19
junjie314 写道 有谁能不能说具体的实现!~~现在如果光排序的那没问题,但是各节点之间不是有顺序的吗??这个顺序是可以改的..现在主要问题是如果要改这个的话就比较麻烦了..比如有两个父节点顺序是23和38 现在把23这个改成39的话..那23下面的所有子节点都要修改..
这个好象比较麻烦,要么是我设计的问题??? 首先创建一个SQL函数:weightValue,如下 CREATE FUNCTION weightValue(@idValue int) RETURNS bigint AS BEGIN DECLARE @return bigint DECLARE @fatherID int DECLARE @number int DECLARE @menuPath VARCHAR(50) DECLARE @treeLevel int DECLARE @weightLevel bigint SET @return = 0 SET @weightLevel = 1 SELECT @fatherID=fatherID,@menuPath=menuPath,@number=number FROM treeTable WHERE id=@idValue SELECT @treeLevel=len(@menuPath)-len(replace(@menuPath,'/','')) WHILE(@treeLevel<9) --此处9为目录层次数,经测试bigInt可以支持9级目录,再多目录层次就会出现益出 BEGIN SET @weightLevel=@weightLevel*100 SET @treeLevel=@treeLevel+1 END SET @return=@number*@weightLevel IF(@fatherID = 1) BEGIN RETURN(@return) END RETURN ([dbo].weightValue(@fatherID)+@return) END 然后一个简单的查询SQL即可,如下: SELECT id,fatherId,menuPath,number FROM treeTable ORDER BY [dbo].weightValue(id) 查询结果就是想要的排列顺序,结果如下,因为结果是实时查询,所以节点可以随时配置 112 1 /112 23 114 112 /112/114 1 116 114 /112/114/116 8 115 114 /112/114/115 9 113 112 /112/113 2 107 1 /107 38 109 107 /107/109 1 111 109 /107/109/111 4 110 109 /107/109/110 5 108 107 /107/108 2 |
|
返回顶楼 | |
发表时间:2007-06-19
TO qinysong: 用你的方法出现这个问题
服务器: 消息 217,级别 16,状态 1,过程 weightValue,行 28 超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32)。 |
|
返回顶楼 | |
发表时间:2007-06-19
你是什么数据库?
|
|
返回顶楼 | |
发表时间:2007-06-19
sqlserver
|
|
返回顶楼 | |
发表时间:2007-06-19
应该不会是数据库的问题吧
|
|
返回顶楼 | |
发表时间:2007-06-19
没问题的,我测试的也是sql server
你再重新创建一个表,把数据导近来,然后拷贝上面sql函数在分析器中执行,你再试试 下面是创建表的语句 CREATE TABLE [dbo].[treeTable] ( [id] [int] NOT NULL , [fatherId] [int] NULL , [menuPath] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [number] [int] NULL ) ON [PRIMARY] GO |
|
返回顶楼 | |
发表时间:2007-06-19
你这个函数真的写的不错 但是 还是有问题..你下看
id fatherId menuPath number 5 1 /5 23 7 5 /5/7 8 6 5 /5/6 9 8 6 /5/6/8 111 9 7 /5/7/9 222 2 1 /2 38 4 2 /2/4 4 3 2 /2/3 5 有多于三层子节点的话 排序就有问题 /5/7/9这个子节点应该排在他的父节点/5/7下面 现在却在/5/6/8下面了 |
|
返回顶楼 | |