(高分)菜鸟求一句sql 语句。asp+access。分类目录对应显示。

如下:
fl表 是 一 个专门 用来 存储网站 “分类目录名称” 的表,
该网站所有分类名称,一级分类名称,二级分类名称等等,统统都放在这一个表中,即每条记录之间可能是父子,子孙关系,也可能是同级关系。

表结构如下:

共有四个字段

id 用来放分类目录名称的id号 ,主键,自动编号
name 用来放 分类目录名称,文本字段
PreId 用来放所属父分类的名称的id号,如果没有父分类则为空 , 文本字段
lever 说明该分类在第几级,1说明他没有上级,属于一级分类,2说明他属于二级分类,以此类推 该字段属于文本字段

该表举例:

id name PreId lever
3 财务部之陈琪部 5 2
4 业务部 1
5 财务部 1
6 业务部之张勇部 4 2
7 业务部之李三部 4 2
8 业务部之王芹部 4 2
9 财务部之李建部 5 2

这样:
我想全部 循环输出 表的所有内容,输出效果如下:
(即要求子分类必须对应的放到他所属的父分类下!!!!!!!!!!)

财务部
财务部之陈琪部
财务部之李建部

业务部
业务部之张勇部
业务部之李三部
业务部之王芹部

问题1:
应该 怎么 做?
按照我的理解,应该大循环里面再嵌套一个小循环,但是实验时出现错误。
麻烦请详细写出实现该输出效果的代码,
必须“详细”写出,我看的 就是详细的!!! 只给思路不给代码的不给分
最好在后面注释一下该句的作用

问题2:
我这样做网站的分类目录好吗?有什么建议?如果 您认为我上面的数据库设计不合适,您有更好的设计方法,可以不必回答问题1而给出其他建议。但是最好给出详细代码并解释。。。。

我的问题回答起来可能比较麻烦呵呵,感谢各位了!!不胜感激!!!

第1个回答  2009-09-17
这个问题其实很简单,建议楼主不要在存储过程里完成。
用asp完成更容易一些,而且效率更好一些。不管怎么说计算机本身的循环都要比数据库的循环快很多。

下面说一下实现方法,具体代码我就不写了。
两个字概括就是“递归”-
写一个函数,
传入一个ID,然后用这个ID循环找自己的子记录,找到之后,再调用本身这个函数,再找自己的自己录。
也就是说循环着自己调用自己,直到找不到自己的子记录,那么该小循环结束,计算机会自动跳到上一级的循环里,继续查找下一记录的自己录,周而复始即可。
第2个回答  2009-09-17
楼主别听那些人忽悠 都不懂的

你说的这个属于典型的BOM算法,虽然复杂,但你这个是其中最简单的类型了

去搜下BOM,至少三种解决的方式,你用的这种组织方式是最普通的一种

问题1
不可能用单条SQL就实现,至少我还没看到过。只能用存储过程。最简单的方式,数据结构里也说了,递归遍历。用临时表。

问题2
你这样组织方式是对的。不过根据目前我所知道的,有一种方式比你这种更合适,不过我忘了名字了。其实这种树遍历应该由DBMS来支持的,不过现阶段他们做得并不是很好。如果你用oracle ,就有个connect by 函数,很容易就实现你的功能。不过access是肯定没的了。本回答被提问者采纳
第3个回答  2009-09-17
这样设计也可以,能够满足"节点"的左右移动--lever控制的"级"。
用sql生成树目录,不建议这么做!毕竟sql不是程序设计语言。
更简单化的结构:
Department(Id,Name,Pre_Id)
Pre_Id为0的节点为1级目录。
sql不直接支持数组/集合,300分也没人愿意写sql生成tree的代码。
第4个回答  2009-09-17
Select name from (
Select * from fl
where isnull(preid,'') =''
union
Select b.* from fl a,fl b
where a.id =b.preid) a
order by name,preid
虽然勉强能实现,但有三级、四级...分类的要实现你的输出就累了
第5个回答  2009-09-21
select id,[name],preid,lever from table1
order by isnull(preid,id),lever,id
相似回答
大家正在搜