最近在做一个小网站,用的可能是别人写的数据库和程序 (呵呵,本人比较菜)
现在碰到了一个问题,没有办法解决,姑求各为高人帮小弟指点迷津有一个这样的表格,classID表示栏目的编号,ClassName栏目名称,ParentID表示父ID(上一级),ParentPath表示栏目的具体相对以一级目录路径,depth表示栏目的深度,RootID表示他的根目录ID,Child表示此栏目由多少个子栏目(2级子目录,非3级子目录),PrevID,NextID表示上、下一个栏目的ID。现在我需要用2个SQL语句,  语句1:输入一个ClassID参数,查询有属于ClassID对应的子栏目(包括N级的),这些栏目必须是最终栏目,不包含子栏目的
     语句2:          另外一个是查询出所有的栏目(包括含有子栏目的栏目)
举例:如果输入ClassID,,对于语句1,应该得到的结果是14,15,18,19,20,23,24,27,28
语句2得到的结果应该是9,10,11,12,14,15,18,19,20,23,24,27,28非常感谢。下面是这个表的具体数据,可以copy到文本文档,然后转换到数据库中调试,谢谢!
========================================================ClassID ClassName    ParentID ParentPath Depth RootID Child PrevID NextID
1 金融衍生品 0 0 0 1 4 0 2
2 商品衍生品 0 0 0 2 4 1 3
3 宏观经济 0 0 0 3 2 2 4
4 培训基地 0 0 0 4 4 3 5
5 衍生品数据 0 0 0 5 0 4 6
6 金融工程学院 0 0 0 6 4 5 7
7 研究报告 0 0 0 7 4 6 74
8 商品衍生品基础知识 74 0,74 1 9 4 76 0
9 股票权证 1 0,1 1 1 2 0 10
10 股指期货 1 0,1 1 1 3 9 11
11 利率衍生品 1 0,1 1 1 2 10 12
12 外汇衍生品 1 0,1 1 1 2 11 0
13 农产品衍生品基础知识 8 0,74,8 2 9 0 55 61
14 股票权证新闻 9 0,1,9 2 1 0 0 15
15 股票权证报价 9 0,1,9 2 1 0 14 0
16 股票权证研究报告 75 0,7,75 2 7 0 0 21
17 股票权证基础知识 76 0,74,76 2 9 0 0 22
18 股票指数信息 10 0,1,10 2 1 0 0 19
19 股指现货和期货报价 10 0,1,10 2 1 0 18 20
20 股指期货报价 10 0,1,10 2 1 0 19 0
21 股指期货研究报告 75 0,7,75 2 7 0 16 25
22 股指期货基础知识 76 0,74,76 2 9 0 17 26
23 利率衍生品信息 11 0,1,11 2 1 0 0 24
24 利率现货和期货报价 11 0,1,11 2 1 0 23 0
25 利率衍生品研究报告 75 0,7,75 2 7 0 21 29
26 利率衍生品基础知识 76 0,74,76 2 9 0 22 30
27 外汇衍生品信息 12 0,1,12 2 1 0 0 28
28 外汇现货及期货报价 12 0,1,12 2 1 0 27 0
29 外汇衍生品研究报告 75 0,7,75 2 7 0 25 0
30 外汇衍生品基础知识 76 0,74,76 2 9 0 26 0
31 金属衍生品 2 0,2 1 2 4 0 32
32 能源衍生品 2 0,2 1 2 4 31 33
33 农产品衍生品 2 0,2 1 2 7 32 34
34 贵金属衍生品 2 0,2 1 2 4 33 0
35 商品衍生品研究报告 7 0,7 1 7 4 75 77
36 铜信息 31 0,2,31 2 2 0 0 37
37 铝信息 31 0,2,31 2 2 0 36 38
38 锌信息 31 0,2,31 2 2 0 37 39
39 铅信息 31 0,2,31 2 2 0 38 0
40 金属衍生品研究报告 35 0,7,35 2 7 0 0 49
41 金属衍生品基础知识 8 0,74,8 2 9 0 0 55
42 玉米信息 33 0,2,33 2 2 0 0 43
43 白糖信息 33 0,2,33 2 2 0 42 44
44 大豆信息 33 0,2,33 2 2 0 43 45
45 小麦信息 33 0,2,33 2 2 0 44 46
46 豆粕信息 33 0,2,33 2 2 0 45 47
47 豆油信息 33 0,2,33 2 2 0 46 48
48 天然橡胶信息 33 0,2,33 2 2 0 47 0
49 农产品衍生品研究报告 35 0,7,35 2 7 0 40 54
50 原油现货信息 32 0,2,32 2 2 0 0 51
51 燃油现货信息 32 0,2,32 2 2 0 50 52
52 原油期货信息 32 0,2,32 2 2 0 51 53
53 燃油期货信息 32 0,2,32 2 2 0 52 0
54 能源衍生品研究报告 35 0,7,35 2 7 0 49 60
55 能源衍生品基础知识 8 0,74,8 2 9 0 41 13
56 黄金信息 34 0,2,34 2 2 0 0 57
57 白银信息 34 0,2,34 2 2 0 56 58
58 黄金期货信息 34 0,2,34 2 2 0 57 59
59 白银期货信息 34 0,2,34 2 2 0 58 0
60 贵金属衍生品研究报告 35 0,7,35 2 7 0 54 0
61 贵金属衍生品基础知识 8 0,74,8 2 9 0 13 0
62 国内信息 3 0,3 1 3 0 0 63
63 国外信息 3 0,3 1 3 0 62 0
64 宏观经济研究报告 7 0,7 1 7 0 0 75
65 宏观经济基础知识 74 0,74 1 9 0 0 76
66 培训信息 4 0,4 1 4 0 0 67
67 课程安排 4 0,4 1 4 0 66 68
68 网络图书馆 4 0,4 1 4 0 67 69
69 公开资料 4 0,4 1 4 0 68 0
70 交易策略 6 0,6 1 6 0 0 71
71 交易工具 6 0,6 1 6 0 70 72
72 风险度量及控制 6 0,6 1 6 0 71 73
73 金融产品设计方案 6 0,6 1 6 0 72 0
74 基础知识 0 0 0 9 3 7 0
75 金融衍生品研究报告 7 0,7 1 7 4 64 35
76 金融衍生品基础知识 74 0,74 1 9 4 65 8
77 金融工程研究报告 7 0,7 1 7 0 35 0

解决方案 »

  1.   

    1.
    DECLARE @id int
    SET @id=1   --假設這里你要輸入的classid為1,也即要查classid=1的終級子欄目
    SELECT ClassID FROM tb a WHERE CHARINDEX(',' + RTRIM(@id) + ','   ,   ',' + ParentPath + ',')>0 AND 1>(SELECT COUNT(1) FROM tb b WHERE CHARINDEX(',' + a.ClassID + ','  , ',' + b.ParentPath + ',')>0)2,
    DECLARE @id int
    SET @id=1   --假設這里你要輸入的classid為1,也即要查classid=1的所有子欄目
    SELECT ClassID FROM tb a WHERE CHARINDEX(',' + RTRIM(@id) + ','   ,   ',' + ParentPath + ',')>0以上代碼隨手寫的,未經測試
      

  2.   

    如果你不定義變量的話,直接把語句中的@id替換為你要查的CLASSID的值即可.
      

  3.   

    第一條語句有點問題,將最後面的 ','+a.classid+','改為 ',' + Rtrim(a.classid) + ','
      

  4.   

    有问题,如果有子栏目的可以查询得到ClassID,但是没有子栏目的话就查询不到,比如查询ClassID=5的情况下就查询不到 
      

  5.   

    你說的是查它子欄目,要查它自己的話,很簡單,在where 的條件後加上  OR ClassID=@ID
      

  6.   

    1.第一个问题的分析说明(加上了注释)
      --ClassID的下级(判断ParentPath中是否包含ClassID)  select * from 表 where charindex(','+ClassID+',',','+ParentPath+',')<>0   --最终栏目(即没有以其ClassID为ParentID的项)
      
      select * from 表 where not exists(select 1 from 表 where ParentID=ClassID)  最终合起来: ClassID项的最终栏目下级
      select * 
      from 表 A
      where charindex(','+ClassID+',',','+A.ParentPath+',')<>0 
      and not exists(select 1 from 表 where A.ParentID=ClassID)
      

  7.   

    2.语句2:          另外一个是查询出所有的栏目(包括含有子栏目的栏目)
        上面的回答1中已经写了
        --ClassID的下级(判断ParentPath中是否包含ClassID)
        select * from 表 where charindex(','+ClassID+',',','+ParentPath+',')<>0