/*
思路说明:
1 展开多层次bom就需要用循环的方法展开,sqlserver中2005版本后就有了递归的查询with
2 要让sql查询出来的结果有像树装结构一样的效果,就需要有层级level,如果没有lever就要计算出一个level来,需要用加空格的方式来实现层级样式
3 需要父子关系的要在一起就一定得要按层级的顺序来排序ordby,所以我先对顶层的加一个顺序号,先按顶层的排序;
然后再加上各父子bom的关系建立路径bom_path(一定要父子子父的串在一起),这样按它进行排序父子关系的就排在一起了。
*/
WITH tree as(
SELECT BOM_NO,ID_NO,BOM_PATH=cast(BOM_NO+ISNULL(ID_NO,'') as varchar(1000)),NAME,PRD_NO,QTY,CST,lev=0,ordby=ROW_NUMBER() OVER(ORDER BY BOM_NO)
FROM TF_BOM
where BOM_NO='20S042903->01'
union all
SELECT B.BOM_NO,B.ID_NO,BOM_PATH=CAST(tree.BOM_PATH+'/'+b.bom_no+'/'+isnull(b.id_no,'') as varchar(1000)),B.NAME,B.PRD_NO,B.QTY,B.CST,LEV=tree.LEV+1,ordby=tree.ordby
FROM tree inner join TF_BOM b on tree.ID_NO=b.BOM_NO
)
SELECT REPLICATE(SPACE(1),LEV*10) + BOM_NO AS BOM_Tree, *
FROM tree
order by ordby,tree.BOM_PATH,tree.lev
OPTION (MAXRECURSION 0);
查询结果示例: