当前位置: 代码迷 >> Sql Server >> 数据库递归查询,求大神帮忙,该如何解决
  详细解决方案

数据库递归查询,求大神帮忙,该如何解决

热度:84   发布时间:2016-04-24 08:58:50.0
数据库递归查询,求大神帮忙
表名是 product_category

epc_id  int 主键自增列
epc_name varchar(20) 名称
epc_parent_id int 

eqc_id      epc_name             epc_parent_id
----------- -------------------- -------------
1           飞机                   0
2           女装                   0
3           男装                   0
4           鞋子                   0
5           箱包                   0
6           垂直                   1
7           滑跑                   1
8           直升机                  6
9           滑翔机                  7
10          三角翼                  7
11          仿真机                  7
12          战斗机                  7
13          旋翼机                  7
14          上装                   2
15          下装                   2
16          裙子                   2
17          袜子                   2
18          上装                   3
19          下装                   3
20          袜子                   3
------------------------------------------------
我想查出所有“飞机”后面的子项
如:
飞机-------第 一层 
垂直\滑跑 ------- 第二层
直升机\滑翔机 三角翼 战斗机 旋翼机 -----------第三层
....
然后要在myeclipse接收每一层的数据
要如何拼写sql?如何接收数据?
有没有什么好办法?好像要创建一个存储过程?
求大神帮忙!
------解决思路----------------------
;with data (eqc_id,epc_name, epc_parent_id)as
(
select 1 ,          '飞机  ',  0  union all
select 2 ,          '女装  ',  0  union all
select 3 ,          '男装  ',  0  union all
select 4 ,          '鞋子  ',  0  union all
select 5 ,          '箱包  ',  0  union all
select 6 ,          '垂直  ',  1  union all
select 7 ,          '滑跑  ',  1  union all
select 8 ,          '直升机',   6 union all
select 9 ,          '滑翔机',   7 union all
select 10,          '三角翼',   7 union all
select 11,          '仿真机',   7 union all
select 12,          '战斗机',   7 union all
select 13,          '旋翼机',   7 union all
select 14,          '上装  ',  2  union all
select 15,          '下装  ',  2  union all
select 16,          '裙子  ',  2  union all
select 17,          '袜子  ',  2  union all
select 18,          '上装  ',  3  union all
select 19,          '下装  ',  3  union all
select 20,          '袜子  ',  3
)
--select * from data

, temp as
( select * from data where eqc_id = 1
  union all
  select data.* from temp
  inner join data on temp.eqc_id = data.epc_parent_id
  )
  select * from temp
  order by eqc_id
------解决思路----------------------

if OBJECT_ID('product_category') is not null
drop table product_category
go
create table product_category(
eqc_id int,
epc_name varchar(20),
epc_parent_id int
)
insert into product_category(eqc_id,epc_name, epc_parent_id)
select 1 ,          '飞机  ',  0  union all
select 2 ,          '女装  ',  0  union all
select 3 ,          '男装  ',  0  union all
select 4 ,          '鞋子  ',  0  union all
select 5 ,          '箱包  ',  0  union all
select 6 ,          '垂直  ',  1  union all
select 7 ,          '滑跑  ',  1  union all
select 8 ,          '直升机',   6 union all
select 9 ,          '滑翔机',   7 union all
select 10,          '三角翼',   7 union all
select 11,          '仿真机',   7 union all
select 12,          '战斗机',   7 union all
select 13,          '旋翼机',   7 union all
select 14,          '上装  ',  2  union all
select 15,          '下装  ',  2  union all
select 16,          '裙子  ',  2  union all
select 17,          '袜子  ',  2  union all
select 18,          '上装  ',  3  union all
select 19,          '下装  ',  3  union all
select 20,          '袜子  ',  3
go
 DECLARE @LevelTable TABLE(
 ID INT, 
 [Level] INT, 
 Sort VARCHAR(50))
DECLARE @Level INT
SET @Level=0

INSERT @LevelTable
SELECT  eqc_id, @Level, CONVERT(VARCHAR, eqc_id)
FROM product_category as A
WHERE A.epc_parent_id= 0

WHILE @@ROWCOUNT>0
BEGIN
    SET @Level=@Level+1

    INSERT @LevelTable 
    SELECT A.eqc_id, @Level, B.Sort + CONVERT(VARCHAR, A.eqc_id)
    FROM product_category A, @LevelTable B
    WHERE A.epc_parent_id = B.ID AND B.[Level] = @Level - 1 
 
    ORDER BY A.eqc_id
END

--显示结果
SELECT A.eqc_id, A.epc_parent_id, Replicate('-', B.[Level]*4) + A.epc_name Name, B.Sort
FROM product_category A, @LevelTable B
WHERE A.eqc_id=B.ID
ORDER BY B.Sort


------解决思路----------------------
只要传一个ID进去就可以使用了
create table #t
(
eqc_id int,
epc_name varchar(20),
epc_parent_id int
)

insert into #t
select  1,'飞机',0 union all
select  2,'女装',0 union all
select  3,'男装',0 union all
select  4,'鞋子',0 union all
select  5,'箱包',0 union all
select  6,'垂直',1 union all
select  7,'滑跑',1 union all
select  8,'直升机',6 union all
select  9,'滑翔机',7 union all
select  10,'三角翼',7 union all
select  11,'仿真机',7 union all
select  12,'战斗机',7 union all
select  13,'旋翼机',7 union all
select  14,'上装',2 union all
select  15,'下装',2 union all
select  16,'裙子',2 union all
select  17,'袜子',2 union all
select  18,'上装',3 union all
select  19,'下装',3 union all
select  20,'袜子',3

;with cte as 
(
select eqc_id,epc_name,epc_parent_id,1 as leve
from #t
where eqc_id=1
union all
select  a.eqc_id,a.epc_name,a.epc_parent_id,b.leve+1 as  leve
from #t a
join cte b on a.epc_parent_id=b.eqc_id
)
select * from cte

/*
eqc_id      epc_name             epc_parent_id leve
----------- -------------------- ------------- -----------
1           飞机                   0             1
6           垂直                   1             2
7           滑跑                   1             2
9           滑翔机                  7             3
10          三角翼                  7             3
11          仿真机                  7             3
12          战斗机                  7             3
13          旋翼机                  7             3
8           直升机                  6             3

(9 行受影响)
*/
  相关解决方案