日期:2014-05-18  浏览次数:20510 次

如何显示数结构的层数
A表

ID PARENT MC
001.001 001 拉丝机
001.001.001 001.001 轴承  
001.001.001.001 001.001.001 垫片


我想查询得到
如果我给的ID 为001.001.001.001,并且要示显示二级

希望得到

ID 一级 二级 MC
001.001.001.001 拉丝机 轴承 垫片


如何我给的ID 为001.001.001,并且要示显示二级

希望得到

ID 一级 二级 MC
001.001.001 无 拉丝机 轴承



------解决方案--------------------
[code=SQL][
IF NOT OBJECT_ID('tb') IS NULL 
DROP TABLE tb
create table tb (id varchar(50), parent varchar(50),mc varchar(50))
insert into tb select '001.001','001','拉丝机'
insert into tb select '001.001.001','001.001','轴承'
insert into tb select '001.001.001.001','001.001.001','垫片'

---根据底层物料查询上层物料(物料用途)

with at as
(
select a.parent,a.id ,0 as levl,mc from tb a where a.id='001.001.001.001'--这里是条件
union all
select a.parent,a.id,levl - 1 ,a.mc from tb a join at on a.id=at.parent
)
select a.id,一级,二级,mc from (
select max(id)id,max(case when levl=-2 then mc else null end )as "一级",max(case when levl=-1 then mc else null end) as "二级" from at )a
join tb on a.id=tb.id
/*
id 一级 二级 mc
001.001.001.001 拉丝机 轴承 垫片

/code]
------解决方案--------------------
既然是固定的是两级,就一直join就可以了,不需要使用cte递归
------解决方案--------------------
是哦。
探讨
既然是固定的是两级,就一直join就可以了,不需要使用cte递归

------解决方案--------------------
SQL code

declare @leng int;
declare @str varchar(50);
set @str='001.001.001.001';

-- 判定级数用这个公式就行,级数 = 字符的长度 - 去除“.”后的长度 (再加或减一个基本量)
set @leng = len(@str) - len(REPLACE(@str, '.', '')) - 1 
print @leng