您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> MSSQL >> 有母件与子件两个表,如何层级展示

有母件与子件两个表,如何层级展示

来源:网络整理     时间:2017/6/30 0:47:00     关键词:

关于网友提出的“ 有母件与子件两个表,如何层级展示”问题疑问,本网通过在网上对“ 有母件与子件两个表,如何层级展示”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 有母件与子件两个表,如何层级展示
描述:

SQL

 有母件与子件两个表,如何层级展示
就是一个母件表和一个子件表,子件表中又包涵了母件,如果查询母件时,可以显示子件层级结构
解决方案1:


 if object_id('tempdb..#Tmp_iBomDetTbl') is not null
drop table #Tmp_iBomDetTbl
CREATE TABLE #Tmp_iBomDetTbl (
Detail_ID int identity(1,1),
ParentItem_No varchar(50) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL,
SubItem_No varchar(50) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL)
Insert into #Tmp_iBomDetTbl Values ('A','B')
Insert into #Tmp_iBomDetTbl Values ('A','C')
Insert into #Tmp_iBomDetTbl Values ('A','D')
Insert into #Tmp_iBomDetTbl Values ('B','E')
Insert into #Tmp_iBomDetTbl Values ('B','F')
Insert into #Tmp_iBomDetTbl Values ('C','G')
Insert into #Tmp_iBomDetTbl Values ('C','H')
Insert into #Tmp_iBomDetTbl Values ('G','I')
Insert into #Tmp_iBomDetTbl Values ('G','O')
--Select * From #Tmp_iBomDetTbl
if object_id('tempdb..#Tmp_ExpandBom') is not null
drop table #Tmp_ExpandBom
Create   TABLE  #Tmp_ExpandBom
(
Detail_ID int identity(1,1),
Level_No  int,
Level_Desc varchar(100) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL,
Item_No   varchar(50)COLLATE Chinese_Taiwan_Stroke_CI_AS NULL,
xPath   varchar(1000) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL
)   
DECLARE @Level_No int   
SET @Level_No=1   
--先加入最上层的一条记录,
 INSERT   #Tmp_ExpandBom   (Level_No,Level_Desc,Item_No,xPath)
 Select  Distinct @Level_No,dbo.IntToStr(@Level_No,3),a.ParentItem_No,ParentItem_No
 From   #Tmp_iBomDetTbl   a   
 Where  Not Exists(select SubItem_No from #Tmp_iBomDetTbl where SubItem_No=a.ParentItem_No )
  
    
  WHILE   @@rowcount>0    --根据最上层的一条记录依次找出下一级数据
BEGIN   
  SET   @Level_No=@Level_No+1   
  INSERT   into #Tmp_ExpandBom  (Level_No,Level_Desc,Item_No,xPath)
Select Level_No,Level_Desc,SubItem_No,xPath
From
(
 Select  
@Level_No as 'Level_No',
b.Level_Desc+dbo.IntToStr((1+(Select count(ParentItem_No)   
  From #Tmp_iBomDetTbl x join #Tmp_ExpandBom y on x.ParentItem_No=y.Item_No
    Where y.Level_No=@Level_No-1  
and  x.Detail_id<>
and x.ParentItem_No=a.ParentItem_No)),3) as 'Level_Desc',
a.SubItem_No,
b.xPath+'>'+a.SubItem_No as 'xPath'
 From  #Tmp_iBomDetTbl a join #Tmp_ExpandBom b on a.ParentItem_No=b.Item_No 
 Where b.Level_No=@Level_No-1  
) a
  End
  
Select * From  #Tmp_ExpandBom   
解决方案2:


create table test(bomId varchar(10), son varchar(10))
go
insert into test values
('A','B'),('A','C'),('A','D'),
('B','E'),('B','F'),
('C','G'),('C','H'),
('G','I'),
('E','O')
go
with m as (
select 1 l, row_number() over(order by bomId) rn, t.bomId, t.son 
from test t 
where bomid = 'A'
union all
select m.l + 1, m.rn  * 10 + row_number() over(order by m.l) , t.bomId, t.son
from test t, m 
where t.bomId = m.son
)
select replicate('+',l) + ltrim(l) Level,  bomId , son 
from m 
order by cast(rn as varchar(30))
go
drop table test 
go
(9 行受影响)
Level                                       bomId      son
-------------------------------------------- ---------- ----------
+1                                          A          B
++2                                         B          E
+++3                                        E          O
++2                                         B          F
+1                                          A          C
++2                                         C          G
+++3                                        G          I
++2                                         C          H
+1                                          A          D
(9 行受影响)
解决方案3:

  ;WITH cte AS(
  SELECT    * ,
            1 AS lvl 
  FROM      #Tmp_so
  WHERE     bomid = 'A'
  UNION ALL
  SELECT    a.* ,
            b.lvl + 1 
  FROM      #Tmp_so a
            JOIN cte b ON b.son = a.bomid
  )
  SELECT lvl,son FROM cte  

 有母件与子件两个表,如何层级展示

以上介绍了“ 有母件与子件两个表,如何层级展示”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/4378138.html

相关图片

相关文章