论坛首页 综合技术论坛

一个捆扰我好几天sql分组排(树形结构查询+排序)

浏览 15716 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-18  
TO 抛出异常的爱 :你那方法不行,可能我没表达清楚吧...你看看我上传的图吧
  • 描述: 看这个图应该能清楚点 呵呵
  • 大小: 1.4 MB
0 请登录后投票
   发表时间:2007-06-18  
汗。。。。
这个你不写成程序么,我的SQL知识。。。。

用存储过程的话,
先用前一个ID
select出后一级的子菜单。。
之后遍历子菜单。。。、
每次遍历把游标放入一个
临时表,
直到完成。。。。(不知道sql能否递归,如不能请用递推来写)
0 请登录后投票
   发表时间:2007-06-18  
  有谁能不能说具体的实现!~~现在如果光排序的那没问题,但是各节点之间不是有顺序的吗??这个顺序是可以改的..现在主要问题是如果要改这个的话就比较麻烦了..比如有两个父节点顺序是23和38  现在把23这个改成39的话..那23下面的所有子节点都要修改..
  这个好象比较麻烦,要么是我设计的问题???
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2007-06-19  
TO qinysong: 用你的方法出现这个问题


服务器: 消息 217,级别 16,状态 1,过程 weightValue,行 28
超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32)。


0 请登录后投票
   发表时间:2007-06-19  
你是什么数据库?
0 请登录后投票
   发表时间:2007-06-19  
sqlserver
0 请登录后投票
   发表时间:2007-06-19  
应该不会是数据库的问题吧
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间: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下面了
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics