表结构如下:
CREATE TABLE tb_loc(id int, name nvarchar(50), parent int)INSERT tb_loc(id,name,parent) VALUES( 1,'河北省',NULL)INSERT tb_loc(id,name,parent) VALUES( 2,'石家庄',1)INSERT tb_loc(id,name,parent) VALUES( 3,'保定',1)INSERT tb_loc(id,name,parent) VALUES( 4,'山西省',NULL)INSERT tb_loc(id,name,parent) VALUES( 5,'太原',4)INSERT tb_loc(id,name,parent) VALUES( 6,'新华区',2)INSERT tb_loc(id,name,parent) VALUES( 7,'北焦村',6)INSERT tb_loc(id,name,parent) VALUES( 8,'大郭村',6)INSERT tb_loc(id,name,parent) VALUES( 9,'河南省',NULL)INSERT tb_loc(id,name,parent) VALUES( 10,'大郭村南',8)INSERT tb_loc(id,name,parent) VALUES( 11,'北焦村北',8)INSERT tb_loc(id,name,parent) VALUES( 12,'北焦村东',7)INSERT tb_loc(id,name,parent) VALUES( 13,'北焦村西',7)INSERT tb_loc(id,name,parent) VALUES( 14,'桥东区',3)INSERT tb_loc(id,name,parent) VALUES( 15,'桥本区',3)想要得到的结果是 ID会做为参数传入如果传进去的是 1 得到如下结果1,'河北省',NULL2,'石家庄',13,'保定',16,'新华区',214,'桥东区',315,'桥本区',37,'北焦村',68,'大郭村',612,'北焦村东',713,'北焦村西',710,'大郭村南',811,'北焦村北',8就是递归得到传入值的所有子孙值
CREATE TABLE tb_loc(id int, name nvarchar(50), parent int)INSERT tb_loc(id,name,parent) VALUES( 1,'河北省',NULL)INSERT tb_loc(id,name,parent) VALUES( 2,'石家庄',1)INSERT tb_loc(id,name,parent) VALUES( 3,'保定',1)INSERT tb_loc(id,name,parent) VALUES( 4,'山西省',NULL)INSERT tb_loc(id,name,parent) VALUES( 5,'太原',4)INSERT tb_loc(id,name,parent) VALUES( 6,'新华区',2)INSERT tb_loc(id,name,parent) VALUES( 7,'北焦村',6)INSERT tb_loc(id,name,parent) VALUES( 8,'大郭村',6)INSERT tb_loc(id,name,parent) VALUES( 9,'河南省',NULL)INSERT tb_loc(id,name,parent) VALUES( 10,'大郭村南',8)INSERT tb_loc(id,name,parent) VALUES( 11,'北焦村北',8)INSERT tb_loc(id,name,parent) VALUES( 12,'北焦村东',7)INSERT tb_loc(id,name,parent) VALUES( 13,'北焦村西',7)INSERT tb_loc(id,name,parent) VALUES( 14,'桥东区',3)INSERT tb_loc(id,name,parent) VALUES( 15,'桥本区',3)想要得到的结果是 ID会做为参数传入如果传进去的是 1 得到如下结果1,'河北省',NULL2,'石家庄',13,'保定',16,'新华区',214,'桥东区',315,'桥本区',37,'北焦村',68,'大郭村',612,'北焦村东',713,'北焦村西',710,'大郭村南',811,'北焦村北',8就是递归得到传入值的所有子孙值
解决方案 »
- 请问求平均值的一个问题,字段里有varchar了怎么办
- 用INDEXPROPERTY函数的哪个属性可以得到索引的STATISTICS_NORECOMPUTE?
- 求一个函数
- 请问在建立了聚集索引的表内,数据页中的数据行是如何存储的
- SQL Server 2008的问题!急急急
- 请各位帮忙了,access数据库怎么导成ms_sql数据库,有方法就结分!!!谢谢!追加分
- sql2000的问题
- 请问哪个网站有SQL Server 2000 下载啊,能下载的?
- 还是关于存储过程的问题 help !!!!
- interbase 数据库的却省密码是?
- 求高手解答:如何查询自动设置字段名
- 如何查询出是哪个sql server 用户对表操作触发了触发器
set @id=1
;with f as
(
select * from tb where id=@id
union all
select a.* from tb a , f b where a.parent=b.id
)
select * from f
with cte as(
select * from tb_loc where ID=1
union all
select a.*from tb_loc a ,cte b
where a.parent=b.id
)
select * from cte order by ISNULL(parent,0),id
id name parent
----------- -------------------------------------------------- -----------
1 河北省 NULL
2 石家庄 1
3 保定 1
6 新华区 2
14 桥东区 3
15 桥本区 3
7 北焦村 6
8 大郭村 6
12 北焦村东 7
13 北焦村西 7
10 大郭村南 8
11 北焦村北 8(12 行受影响)
declare @id int
set @id=1with cte as(
select * from tb_loc where ID=@id
union all
select a.*from tb_loc a ,cte b
where a.parent=b.id
)
select * from cte order by ISNULL(parent,0),id
id name parent
----------- -------------------------------------------------- -----------
1 河北省 NULL
2 石家庄 1
3 保定 1
6 新华区 2
14 桥东区 3
15 桥本区 3
7 北焦村 6
8 大郭村 6
12 北焦村东 7
13 北焦村西 7
10 大郭村南 8
11 北焦村北 8(12 行受影响)
go
create function f_getC(@id int)
returns @re table(id int,level int)
as
begin
declare @l int
set @l=0
insert @re select @id,@l
while @@rowcount>0
begin
set @l=@l+1
insert @re select a.id,@l from tb_loc as a,@re as b where b.id=a.parent and b.level=@l-1
end
return
end
go
select a.* from tb_loc a,f_getC(1) b where a.id=b.id order by b.level
/*
id name parent
----------- -------------------------------------------------- -----------
1 河北省 NULL
2 石家庄 1
3 保定 1
6 新华区 2
14 桥东区 3
15 桥本区 3
7 北焦村 6
8 大郭村 6
12 北焦村东 7
13 北焦村西 7
10 大郭村南 8
11 北焦村北 8(所影响的行数为 12 行)*/
DROP PROC p_getbom
GO
CREATE PROC p_getbom
@id INT
AS
WITH t AS
(
SELECT *, px = CAST(id AS VARBINARY)
FROM tb_loc
WHERE ID = @id
UNION ALL
SELECT a.* ,CAST(px+CAST(a.id AS VARBINARY) AS VARBINARY)
FROM tb_loc a, t b
WHERE a.parent = b.id
)
SELECT id, NAME, parent
FROM t
ORDER BY px
GOEXEC p_getbom 1
/*
id NAME parent
----------- -------------------------------------------------- -----------
1 河北省 NULL
2 石家庄 1
6 新华区 2
7 北焦村 6
12 北焦村东 7
13 北焦村西 7
8 大郭村 6
10 大郭村南 8
11 北焦村北 8
3 保定 1
14 桥东区 3
15 桥本区 3(12 行受影响)
*/
DROP PROC p_getbom
GO
CREATE PROC p_getbom
@id INT
AS
WITH t AS
(
SELECT *, 0 AS lvl, px = CAST(id AS VARBINARY)
FROM tb_loc
WHERE ID = @id
UNION ALL
SELECT a.*, lvl+1, CAST(px+CAST(a.id AS VARBINARY) AS VARBINARY)
FROM tb_loc a, t b
WHERE a.parent = b.id
)
SELECT REPLICATE('.', lvl)+LTRIM(id) id, NAME, parent
FROM t
ORDER BY px
GOEXEC p_getbom 1
/*
id NAME parent
---------- -------------------------------------------------- -----------
1 河北省 NULL
.2 石家庄 1
..6 新华区 2
...7 北焦村 6
....12 北焦村东 7
....13 北焦村西 7
...8 大郭村 6
....10 大郭村南 8
....11 北焦村北 8
.3 保定 1
..14 桥东区 3
..15 桥本区 3(12 行受影响)
*/这样直观些
--sql 2005之后declare @id int
set @id=1
;with t as
(
select * from tb_loc where id=@id union all
select a.* from tb_loc a join t on a.parent=t.id
)select * from t order by isnull(parent,''),id
set @id=1
;with t as
(
select * from tb_loc where id=@id union all
select a.* from tb_loc a join t on a.parent=t.id
)
--ddd
select * from t order by isnull(parent,0),id