| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2373 人关注过本帖
标题:这个SQL语句怎么写?
只看楼主 加入收藏
青格儿
Rank: 4
等 级:贵宾
威 望:11
帖 子:698
专家分:20
注 册:2007-7-31
结帖率:87.5%
收藏
 问题点数:0 回复次数:15 
这个SQL语句怎么写?
id level rootid name
1   1      0     水果
2   2      1     瓜类 
3   3      2    西瓜
4   3      2     哈密瓜
……
显示:
id  name
3   水果/瓜类/西瓜
4   水果/瓜类/哈密瓜

也就是显示成
level 
1/2/3这样的格式 的name

这个SQL语句怎么写?请SQL高手帮我看看,怎么拼接 ?
搜索更多相关主题的帖子: SQL 语句 
2008-10-10 18:03
myemail1983
Rank: 2
来 自:南京
等 级:新手上路
威 望:3
帖 子:256
专家分:0
注 册:2008-7-27
收藏
得分:0 
没看明白

寻找学习的动力,承接小型程序设计,呵呵,为了激励自己学习下。
虽然做不到无私,但会学着去帮助别人
2008-10-10 21:26
球球
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:1146
专家分:265
注 册:2005-11-28
收藏
得分:0 
期待!~~
写得不好,纯粹是为了练习CTE
CREATE TABLE tb
(
id int IDENTITY(1,1),
level int,
rootid int,
name nvarchar(20)
);
INSERT INTO tb VALUES(1,0,'水果')
INSERT INTO tb VALUES(2,1,'瓜类')
INSERT INTO tb VALUES(3,2,'西瓜')
INSERT INTO tb VALUES(3,2,'哈密瓜')
INSERT INTO tb VALUES(1,0,'蔬菜')
INSERT INTO tb VALUES(2,5,'小白菜')
INSERT INTO tb VALUES(3,2,'香瓜')
;
DECLARE @tn nvarchar(20),@str nvarchar(4000)
SET @str = ''
SET @tn=N'水果'
;WITH
TBS
AS
(
SELECT id,name,level FROM tb WHERE name=@tn
UNION ALL
SELECT a.id,a.name,a.level FROM tb a,TBS b
WHERE a.rootid=b.id
)
SELECT @str = @str+'/'+name FROM TBS WHERE level=1 or level=2
SET @str = right(@str , len(@str) - 1);
WITH
TBS
AS
(
SELECT id,name,level FROM tb WHERE name=@tn
UNION ALL
SELECT A.id,A.name,A.level FROM tb A,TBS B
WHERE a.rootid=b.id
)
SELECT id,(@str+'/'+name) name FROM TBS WHERE level=3
;
DROP TABLE tb

[[it] 本帖最后由 球球 于 2008-10-11 03:36 编辑 [/it]]

好累
2008-10-11 03:29
西风独自凉
Rank: 8Rank: 8
等 级:贵宾
威 望:43
帖 子:3380
专家分:28
注 册:2007-8-2
收藏
得分:0 
看不明白

2008-10-11 11:15
青格儿
Rank: 4
等 级:贵宾
威 望:11
帖 子:698
专家分:20
注 册:2007-7-31
收藏
得分:0 
辛苦版主了,那么晚了还在写程序。
呵呵,不过,有点问题啊

SET @tn=N'水果'
这里你定义了查询水果类,嗯,我要是想示所有的分类的呢?我用SQL2005运行了上面的,没出错,也查出了水果类,可我的表中不只水果类。

我项目用的数据库是SQL2000,我执行上面的代码,却报错:
在关键字 'WITH' 附近有语法错误。(我怎么改,它都不对?SQL2000里用不了with as ?)
with as 我查了下,它可以提高查询速度(用来做子查询用的)嗯,它都有什么用法,能简单给我讲下吗?
2008-10-11 11:47
青格儿
Rank: 4
等 级:贵宾
威 望:11
帖 子:698
专家分:20
注 册:2007-7-31
收藏
得分:0 
看不明白?我没表达清楚?(你们把球球版主的代码,运行一下,看看能不能明白?)

简单来说,就是从表中查询出level为3的name 列表 ,但要求显示
name时,按层级显示,显示成 层级为1/2/3的 name格式 
如: id  name
   3   水果(它的level为1)/瓜类(level 2)/西瓜(level 3)

也许是我语言表达能力不行,嗯,简单理解为,怎么从上述表(1楼)中,查询出(1楼 显示)下面的那个结果。这SQL怎么写?
2008-10-11 11:58
球球
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:1146
专家分:265
注 册:2005-11-28
收藏
得分:0 
所以说我在期待中啊,我这里是把条件固定死了.
这是个递归操作,为什么不另外用个字段把你要的结果保存起来,在每次插入数据时就直接查询上一父节点的PathName,然后加上自己的name,形成这个字段的值。

好累
2008-10-12 10:03
球球
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:1146
专家分:265
注 册:2005-11-28
收藏
得分:0 
[bo][un]青格儿[/un] 在 2008-10-11 11:47 的发言:[/bo]

我项目用的数据库是SQL2000,我执行上面的代码,却报错:
在关键字 'WITH' 附近有语法错误。 ...


CTE是sql2005的新增功能,有递归操作的功能,可以自己调自己。在2000里运行会报错。

好累
2008-10-12 10:06
球球
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:1146
专家分:265
注 册:2005-11-28
收藏
得分:0 
我在以前做的一个权限模块中就是另外用PathName保存级别Name,
比如父节点为0时的Name为‘水果’,PathName就为‘水果’,
当在‘水果’下面添加‘瓜类’时,PathName就为'瓜类'父节点的PathName+'/'+Name='水果/瓜类',
当在‘瓜类’下面添加‘西瓜’时,PathName就为'西瓜'父节点(西瓜的父节点为‘瓜类’)的PathName+'/'+Name='水果/瓜类/西瓜'.
这样避免了在显示PathName时又去递归的查询!

好累
2008-10-12 10:19
球球
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:1146
专家分:265
注 册:2005-11-28
收藏
得分:0 
CREATE TABLE tb
(
id int IDENTITY(1,1),
level int,
rootid int,
name nvarchar(20)
)
GO
INSERT INTO tb VALUES(1,0,'水果')
INSERT INTO tb VALUES(2,1,'瓜类')
INSERT INTO tb VALUES(3,2,'西瓜')
INSERT INTO tb VALUES(3,2,'哈密瓜')
INSERT INTO tb VALUES(1,0,'蔬菜')
INSERT INTO tb VALUES(2,5,'青菜')
INSERT INTO tb VALUES(3,2,'香瓜')
INSERT INTO tb VALUES(3,6,'上海青')
GO
DECLARE @t TABLE
(
    id int,
    level int,
    name nvarchar(20),
    rootid int,
    path nvarchar(4000)
)
INSERT INTO @t SELECT id,level,name,rootid,name FROM tb WHERE rootid=0
WHILE @@ROWCOUNT<>0
BEGIN
    INSERT INTO @t
    SELECT b.id,b.level,b.name,b.rootid,a.path+'/'+b.name
        FROM @t a,tb b
            WHERE a.id=b.rootid AND NOT EXISTS(SELECT 1 FROM @t WHERE id=b.id)
END
SELECT id,path FROM @t WHERE level=3 OR level=4
GO
DROP TABLE tb

[[it] 本帖最后由 球球 于 2008-10-12 13:52 编辑 [/it]]

好累
2008-10-12 12:18
快速回复:这个SQL语句怎么写?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017972 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved