首页 新闻 会员 周边

sql server 如何实现树查询

0
悬赏园豆:50 [待解决问题]

不能用自定义的函数,储存过程 。只能用普通的语句,请问怎么写么。。构造一个树查询出来。。

顶级结点为0   .

问题补充:

随便从一个字段往上查询它们的父级节点。

Eric_ho的主页 Eric_ho | 初学一级 | 园豆:178
提问于:2011-12-16 23:04
< >
分享
所有回答(9)
0

像这样的树结构查询,都要用到递归查询。而递归查询在sqlserver2000里面不使用函数是实现不了的。而在2005sqlserver就支持递归的表表达式了。with语句

小小刀 | 园豆:1991 (小虾三级) | 2011-12-16 23:11

这个想过的。。就是查出来的数据是无序的。。等于不准确

支持(0) 反对(0) Eric_ho | 园豆:178 (初学一级) | 2011-12-18 00:59

@Eric_ho: 应该可以排序吧,你用两个排序的方式就可以了。一个是层里面的排序,一个是层的排序。

支持(0) 反对(0) 小小刀 | 园豆:1991 (小虾三级) | 2011-12-19 22:08
0

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

 

你以这个为列试试

Mr、李 | 园豆:206 (菜鸟二级) | 2011-12-17 08:34

这个试过的。。你用这个函数只能查询结点数据,并不能内部排序。

支持(0) 反对(0) Eric_ho | 园豆:178 (初学一级) | 2011-12-18 00:58
0

这个with语句不行,而且要达到你的要求仅一个SQL语句真有点难,观望高手解决。

勤劳的渔网工作者 | 园豆:572 (小虾三级) | 2011-12-18 22:38

俺 知道怎么解决了。改造一下就可以了

支持(0) 反对(0) Eric_ho | 园豆:178 (初学一级) | 2011-12-20 00:03
0

with语句能查出构造成树所有需要的数据,逻辑上,这样一个二维表是树结构的,排序的话在with语句了用order by不能查吗?

如果想显示的时候按顺序显示,在显示的时候排序就可以了吧

OOLi | 园豆:163 (初学一级) | 2011-12-19 10:24
0

我记得2005中 自带的例子有一个 生成树的语句,你找找看看

cuishuyue | 园豆:37 (初学一级) | 2011-12-19 15:00

啥 。。。。俺 找不到

支持(0) 反对(0) Eric_ho | 园豆:178 (初学一级) | 2011-12-20 00:03
0
邀月 | 园豆:25475 (高人七级) | 2011-12-19 16:42

受教了

支持(0) 反对(0) Eric_ho | 园豆:178 (初学一级) | 2011-12-20 00:03
0

可以修改一些表结构,使用编码来确定数据的层级。

比如:编码101为一级,编码101100位二级且隶属101

表结构:

-------------------------------------------

id       编码      名称               级别

-----------------------------------------------

100        101          部门一                    1

101        101100     部门一下属一           2

。。。。。

---------------------------------------------------------

查询时可以用like关键字查询,不知道这样能否满足你的需求

休闲加油站 | 园豆:330 (菜鸟二级) | 2011-12-20 11:10

能否讲得清楚一点呢

貌似有点意思 。你的思路

支持(0) 反对(0) Eric_ho | 园豆:178 (初学一级) | 2012-01-01 11:29

@Eric_ho: 重要的就是编号的规则,你可以看一下你的身份证号码,前两位是省份编码,后面两位是城市编码。这是标准的中国行政区域编码,比如我要查询全河南省的城市以及下属机构的信息,就可以使用like '41%' 这样的查询条件,又比如查询河南省新乡市及其下属机构信息,可以使用 like '4107%' 这样的条件。  这样说不知道你是否明白。

不过这种方法在新增编辑的时候比较麻烦,主要是编码的计算。但是在查询时特别方便,避免了递归闭包

支持(0) 反对(0) 休闲加油站 | 园豆:330 (菜鸟二级) | 2012-01-09 12:46
0

如果你的表有上面这兄弟的编码这一列.就很好做.

我根据上面这个兄弟的语句改了一下

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 编码

dearz | 园豆:588 (小虾三级) | 2011-12-29 10:40

兄弟,你这里面/3,这就不对了 。不完善。。内码不一定是3位数字

支持(0) 反对(0) Eric_ho | 园豆:178 (初学一级) | 2012-01-01 11:28

@Eric_ho: 这个是你们自己设计吧,你想定几位就是几位啊,内码是开发人员用的,

内定就可以了,那不然要了这内码有什么用呢

支持(0) 反对(0) dearz | 园豆:588 (小虾三级) | 2012-01-04 08:53
0

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哈哈~

Gamain | 园豆:357 (菜鸟二级) | 2015-02-09 17:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册