不能用自定义的函数,储存过程 。只能用普通的语句,请问怎么写么。。构造一个树查询出来。。
顶级结点为0 .
随便从一个字段往上查询它们的父级节点。
像这样的树结构查询,都要用到递归查询。而递归查询在sqlserver2000里面不使用函数是实现不了的。而在2005sqlserver就支持递归的表表达式了。with语句
这个想过的。。就是查出来的数据是无序的。。等于不准确
@Eric_ho: 应该可以排序吧,你用两个排序的方式就可以了。一个是层里面的排序,一个是层的排序。
WITH lmenu(MenuId,MenuName,MenuParentId,level)
as
(
SELECT MenuId,MenuName,MenuParentId,0 level FROM MenuInfo where MenuParentId=0
UNION ALL
SELECT A.MenuId, A.MenuName,A.MenuParentId,b.level+1 FROM MenuInfo A,lmenu b
where a.MenuParentId = b.MenuId
)
select * from lmenu
你以这个为列试试
这个试过的。。你用这个函数只能查询结点数据,并不能内部排序。
这个with语句不行,而且要达到你的要求仅一个SQL语句真有点难,观望高手解决。
俺 知道怎么解决了。改造一下就可以了
with语句能查出构造成树所有需要的数据,逻辑上,这样一个二维表是树结构的,排序的话在with语句了用order by不能查吗?
如果想显示的时候按顺序显示,在显示的时候排序就可以了吧
我记得2005中 自带的例子有一个 生成树的语句,你找找看看
啥 。。。。俺 找不到
可以修改一些表结构,使用编码来确定数据的层级。
比如:编码101为一级,编码101100位二级且隶属101
表结构:
-------------------------------------------
id 编码 名称 级别
-----------------------------------------------
100 101 部门一 1
101 101100 部门一下属一 2
。。。。。
---------------------------------------------------------
查询时可以用like关键字查询,不知道这样能否满足你的需求
能否讲得清楚一点呢
貌似有点意思 。你的思路
@Eric_ho: 重要的就是编号的规则,你可以看一下你的身份证号码,前两位是省份编码,后面两位是城市编码。这是标准的中国行政区域编码,比如我要查询全河南省的城市以及下属机构的信息,就可以使用like '41%' 这样的查询条件,又比如查询河南省新乡市及其下属机构信息,可以使用 like '4107%' 这样的条件。 这样说不知道你是否明白。
不过这种方法在新增编辑的时候比较麻烦,主要是编码的计算。但是在查询时特别方便,避免了递归闭包
如果你的表有上面这兄弟的编码这一列.就很好做.
我根据上面这个兄弟的语句改了一下
declare @table table (id int,编码 int,名称 varchar(12),级别 int)
insert into @table
select 100,101,'部门一',1 union all
select 101,101100,'部门一下属一',2
SELECT id, STUFF(a.名称,1,0,REPLICATE('|--',(LEN(a.编码)-3)/3)) name,
a. 编码
FROM @table a
ORDER BY 编码
兄弟,你这里面/3,这就不对了 。不完善。。内码不一定是3位数字
@Eric_ho: 这个是你们自己设计吧,你想定几位就是几位啊,内码是开发人员用的,
内定就可以了,那不然要了这内码有什么用呢
1,倒查 ---- 查询Id是10的那条记录的所有父级节点 sql如下:
; WITH Tree (id,pid)as ( select 1,0 UNION ALL select 2,0 UNION ALL select 3,0 UNION ALL select 4,1 UNION ALL select 5,2 UNION ALL select 6,3 UNION ALL select 7,4 UNION ALL select 8,5 UNION ALL select 9,7 UNION ALL select 10,9 ), CTE (id,pid,level)as( select id,pid,0 as [level] FROM Tree WHERE id=10 UNION ALL select Tree.id,Tree.pid ,[level]+1 FROM CTE INNER JOIN Tree ON CTE.pid=Tree.id ) SELECT * from CTE ORDER BY id
2,正查 ---- 查询ID是1的那条记录的所有子节点 sql如下:
; WITH Tree (id,pid)as ( select 1,0 UNION ALL select 2,0 UNION ALL select 3,0 UNION ALL select 4,1 UNION ALL select 5,2 UNION ALL select 6,3 UNION ALL select 7,4 UNION ALL select 8,5 UNION ALL select 9,7 UNION ALL select 10,9 ), CTE (id,pid,level)as( select id,pid,0 as [level] FROM Tree WHERE pid=1 UNION ALL select Tree.id,Tree.pid ,[level]+1 FROM CTE INNER JOIN Tree ON CTE.id=Tree.pid ) SELECT * from CTE ORDER BY id
总有一款适合你,O(∩_∩)O哈哈~