zoukankan      html  css  js  c++  java
  • 查询指定节点及其所有子节点的方法

      1 /*
    2 标题:SQL SERVER 2005中查询指定节点及其所有子节点的方法(表格形式显示)
    3 作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
    4 时间:2010-02-02
    5 地点:新疆乌鲁木齐
    6 */
    7
    8 create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
    9 insert into tb values('001' , null , N'广东省')
    10 insert into tb values('002' , '001' , N'广州市')
    11 insert into tb values('003' , '001' , N'深圳市')
    12 insert into tb values('004' , '002' , N'天河区')
    13 insert into tb values('005' , '003' , N'罗湖区')
    14 insert into tb values('006' , '003' , N'福田区')
    15 insert into tb values('007' , '003' , N'宝安区')
    16 insert into tb values('008' , '007' , N'西乡镇')
    17 insert into tb values('009' , '007' , N'龙华镇')
    18 insert into tb values('010' , '007' , N'松岗镇')
    19 go
    20
    21 DECLARE @ID VARCHAR(3)
    22
    23 --查询ID = '001'的所有子节点
    24 SET @ID = '001'
    25 ;WITH T AS
    26 (
    27 SELECT ID , PID , NAME
    28 FROM TB
    29 WHERE ID = @ID
    30 UNION ALL
    31 SELECT A.ID , A.PID , A.NAME
    32 FROM TB AS A JOIN T AS B ON A.PID = B.ID
    33 )
    34 SELECT * FROM T ORDER BY ID
    35 /*
    36 ID PID NAME
    37 ---- ---- ----------
    38 001 NULL 广东省
    39 002 001 广州市
    40 003 001 深圳市
    41 004 002 天河区
    42 005 003 罗湖区
    43 006 003 福田区
    44 007 003 宝安区
    45 008 007 西乡镇
    46 009 007 龙华镇
    47 010 007 松岗镇
    48
    49 (10 行受影响)
    50 */
    51
    52 --查询ID = '002'的所有子节点
    53 SET @ID = '002'
    54 ;WITH T AS
    55 (
    56 SELECT ID , PID , NAME
    57 FROM TB
    58 WHERE ID = @ID
    59 UNION ALL
    60 SELECT A.ID , A.PID , A.NAME
    61 FROM TB AS A JOIN T AS B ON A.PID = B.ID
    62 )
    63 SELECT * FROM T ORDER BY ID
    64 /*
    65 ID PID NAME
    66 ---- ---- ----------
    67 002 001 广州市
    68 004 002 天河区
    69
    70 (2 行受影响)
    71 */
    72
    73 --查询ID = '003'的所有子节点
    74 SET @ID = '003'
    75 ;WITH T AS
    76 (
    77 SELECT ID , PID , NAME
    78 FROM TB
    79 WHERE ID = @ID
    80 UNION ALL
    81 SELECT A.ID , A.PID , A.NAME
    82 FROM TB AS A JOIN T AS B ON A.PID = B.ID
    83 )
    84 SELECT * FROM T ORDER BY ID
    85 /*
    86 ID PID NAME
    87 ---- ---- ----------
    88 003 001 深圳市
    89 005 003 罗湖区
    90 006 003 福田区
    91 007 003 宝安区
    92 008 007 西乡镇
    93 009 007 龙华镇
    94 010 007 松岗镇
    95
    96 (7 行受影响)
    97 */
    98
    99 drop table tb
    100
    101 --注:除ID值不一样外,三个SQL语句是一样的。
    102
    103
    104
    105 /*
    106 标题:SQL SERVER 2005中查询指定节点及其所有子节点的方法(字符串形式显示)
    107 作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
    108 时间:2010-02-02
    109 地点:新疆乌鲁木齐
    110 */
    111
    112 create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
    113 insert into tb values('001' , null , N'广东省')
    114 insert into tb values('002' , '001' , N'广州市')
    115 insert into tb values('003' , '001' , N'深圳市')
    116 insert into tb values('004' , '002' , N'天河区')
    117 insert into tb values('005' , '003' , N'罗湖区')
    118 insert into tb values('006' , '003' , N'福田区')
    119 insert into tb values('007' , '003' , N'宝安区')
    120 insert into tb values('008' , '007' , N'西乡镇')
    121 insert into tb values('009' , '007' , N'龙华镇')
    122 insert into tb values('010' , '007' , N'松岗镇')
    123 go
    124
    125 ;with t as
    126 (
    127 select id , cid = id from tb
    128 union all
    129 select t.id , cid = tb.id
    130 from t join tb on tb.pid = t.cid
    131 )
    132 select id , cid = STUFF((SELECT ',' + rtrim(cid) FROM t WHERE id = tb.id FOR XML PATH('')) , 1 , 1 , '')
    133 from tb
    134 group by id
    135 order by id
    136 /*
    137 id cid
    138 ---- ---------------------------------------
    139 001 001,002,003,005,006,007,008,009,010,004
    140 002 002,004
    141 003 003,005,006,007,008,009,010
    142 004 004
    143 005 005
    144 006 006
    145 007 007,008,009,010
    146 008 008
    147 009 009
    148 010 010
    149
    150 (10 行受影响)
    151 */
    152
    153 ;with t as
    154 (
    155 select id , name , cid = id , path = cast(name as nvarchar(100)) from tb
    156 union all
    157 select t.id , t.name , cid = tb.id , path = cast(tb.name as nvarchar(100))
    158 from t join tb on tb.pid = t.cid
    159 )
    160 select id , name ,
    161 cid = STUFF((SELECT ',' + rtrim(cid) FROM t WHERE id = tb.id FOR XML PATH('')) , 1 , 1 , ''),
    162 path = STUFF((SELECT ',' + path FROM t WHERE id = tb.id FOR XML PATH('')) , 1 , 1 , '')
    163 from tb
    164 group by id , name
    165 order by id
    166 /*
    167 id name cid path
    168 ---- ---------- ------------------------------------------- ---------------------------------------------------------------------
    169 001 广东省 001,002,003,005,006,007,008,009,010,004 广东省,广州市,深圳市,罗湖区,福田区,宝安区,西乡镇,龙华镇,松岗镇,天河区
    170 002 广州市 002,004 广州市,天河区
    171 003 深圳市 003,005,006,007,008,009,010 深圳市,罗湖区,福田区,宝安区,西乡镇,龙华镇,松岗镇
    172 004 天河区 004 天河区
    173 005 罗湖区 005 罗湖区
    174 006 福田区 006 福田区
    175 007 宝安区 007,008,009,010 宝安区,西乡镇,龙华镇,松岗镇
    176 008 西乡镇 008 西乡镇
    177 009 龙华镇 009 龙华镇
    178 010 松岗镇 010 松岗镇
    179
    180 (10 行受影响)
    181 */
    182
    183 drop table tb
     
     
     
      1 /*
    2 标题:SER SERVER 2000中统计各节点及其子节点的级别
    3 作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
    4 时间:2011-05-06
    5 地点:重庆航天职业学院
    6
    7 id pid name
    8 ---- ---- ----------
    9 001 NULL 广东省
    10 002 001 广州市
    11 003 001 深圳市
    12 004 002 天河区
    13 005 003 罗湖区
    14 006 003 福田区
    15 007 003 宝安区
    16 008 007 西乡镇
    17 009 007 龙华镇
    18 010 007 松岗镇
    19 011 006 岗下镇
    20 012 005 上沙镇
    21 013 004 天河镇
    22
    23 -->统计结果如下:
    24
    25 ID PID NAME level
    26 ---- ---- ---------- -----------
    27 001 NULL 广东省 1
    28 002 001 广州市 2
    29 003 001 深圳市 2
    30 004 002 天河区 3
    31 005 003 罗湖区 3
    32 006 003 福田区 3
    33 007 003 宝安区 3
    34 008 007 西乡镇 4
    35 009 007 龙华镇 4
    36 010 007 松岗镇 4
    37 011 006 岗下镇 4
    38 012 005 上沙镇 4
    39 013 004 天河镇 4
    40 */
    41
    42 create table tb(id varchar(3) , pid varchar(3) , name varchar(10))
    43 insert into tb values('001' , null , '广东省')
    44 insert into tb values('002' , '001' , '广州市')
    45 insert into tb values('003' , '001' , '深圳市')
    46 insert into tb values('004' , '002' , '天河区')
    47 insert into tb values('005' , '003' , '罗湖区')
    48 insert into tb values('006' , '003' , '福田区')
    49 insert into tb values('007' , '003' , '宝安区')
    50 insert into tb values('008' , '007' , '西乡镇')
    51 insert into tb values('009' , '007' , '龙华镇')
    52 insert into tb values('010' , '007' , '松岗镇')
    53 insert into tb values('011' , '006' , '岗下镇')
    54 insert into tb values('012' , '005' , '上沙镇')
    55 insert into tb values('013' , '004' , '天河镇')
    56 go
    57
    58 create function f_getlevel(@id varchar(3)) returns int
    59 as
    60 begin
    61 declare @re_str as varchar(3)
    62 set @re_str = ''
    63 declare @level as int
    64 set @level = 1
    65 select @re_str = pid from tb where id = @id
    66 while exists (select 1 from tb where id = @re_str)
    67 begin
    68 select @re_str = pid from tb where id = @re_str
    69 set @level = @level + 1
    70 end
    71 return @level
    72 end
    73 go
    74
    75 select * , dbo.f_getlevel(id) level from tb
    76
    77 drop function dbo.f_getlevel
    78 drop table tb
    79
    80 /*--------------------------------------------------------------------------------------------
    81
    82 ---------------------------------------------------------------------------------------------*/
    83
    84 /*
    85 标题:SER SERVER 2005中统计各节点及其子节点的级别
    86 作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
    87 时间:2011-05-06
    88 地点:重庆航天职业学院
    89
    90 id pid name
    91 ---- ---- ----------
    92 001 NULL 广东省
    93 002 001 广州市
    94 003 001 深圳市
    95 004 002 天河区
    96 005 003 罗湖区
    97 006 003 福田区
    98 007 003 宝安区
    99 008 007 西乡镇
    100 009 007 龙华镇
    101 010 007 松岗镇
    102 011 006 岗下镇
    103 012 005 上沙镇
    104 013 004 天河镇
    105
    106 -->统计结果如下:
    107
    108 ID PID NAME level
    109 ---- ---- ---------- -----------
    110 001 NULL 广东省 1
    111 002 001 广州市 2
    112 003 001 深圳市 2
    113 004 002 天河区 3
    114 005 003 罗湖区 3
    115 006 003 福田区 3
    116 007 003 宝安区 3
    117 008 007 西乡镇 4
    118 009 007 龙华镇 4
    119 010 007 松岗镇 4
    120 011 006 岗下镇 4
    121 012 005 上沙镇 4
    122 013 004 天河镇 4
    123 */
    124
    125 create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
    126 insert into tb values('001' , null , N'广东省')
    127 insert into tb values('002' , '001' , N'广州市')
    128 insert into tb values('003' , '001' , N'深圳市')
    129 insert into tb values('004' , '002' , N'天河区')
    130 insert into tb values('005' , '003' , N'罗湖区')
    131 insert into tb values('006' , '003' , N'福田区')
    132 insert into tb values('007' , '003' , N'宝安区')
    133 insert into tb values('008' , '007' , N'西乡镇')
    134 insert into tb values('009' , '007' , N'龙华镇')
    135 insert into tb values('010' , '007' , N'松岗镇')
    136 insert into tb values('011' , '006' , N'岗下镇')
    137 insert into tb values('012' , '005' , N'上沙镇')
    138 insert into tb values('013' , '004' , N'天河镇')
    139 go
    140
    141 ;WITH T AS
    142 (
    143 SELECT ID , PID , NAME , level = 1 FROM TB where pid is null
    144 UNION ALL
    145 SELECT B.ID , B.PID , B.NAME , A.level + 1 FROM t A JOIN tb AS B ON A.id = B.pID
    146 )
    147 select * from t order by id
    148
    149 drop table tb


     

  • 相关阅读:
    POJ-2393
    POJ-1328
    POJ-2376
    CF-811B
    CF-811A
    CF-816B
    P1111 修复公路
    P2777 [AHOI2016初中组]自行车比赛
    P1889 士兵站队
    P1459 三值的排序 Sorting a Three-Valued Sequence
  • 原文地址:https://www.cnblogs.com/lilwzca/p/2253030.html
Copyright © 2011-2022 走看看