日期:2014-05-18 浏览次数:20694 次
CREATE TABLE BOM(阀门ID VARCHAR(10),零件ID VARCHAR(10),单位用量 INT)
GO
INSERT BOM SELECT 
'a','a1', 1  UNION ALL SELECT 
'a1','a11', 1 UNION ALL SELECT 
'a' ,'a2', 1 UNION ALL SELECT 
'a2', 'a22' ,1 UNION ALL SELECT 
'b', 'b1' ,1 UNION ALL SELECT 
'b1', 'b11' ,1 UNION ALL SELECT 
'b', 'b2', 1 UNION ALL SELECT 
'b2', 'b22' ,1;
GO 
;WITH cte AS
(
    SELECT * ,path=CAST(阀门ID+'->'+零件ID AS VARCHAR(8000)),lev=1 FROM BOM WHERE patindex('%[1-9]%',阀门ID)=0
    UNION ALL
    SELECT B.*,cast(c.path+'->'+B.零件ID AS VARCHAR(8000)),LEV+1 FROM CTE C JOIN BOM B ON C.零件ID=B.阀门ID
)
SELECT LEFT(c.path,charindex('-',c.path)-1)  阀门ID,零件ID,单位用量 
FROM CTE c 
WHERE NOT EXISTS (SELECT * FROM cte WHERE  LEFT(path,charindex('-',path)-1)=LEFT(c.path,charindex('-',c.path)-1) AND LEV>c.lev)
ORDER BY 阀门ID,零件ID
/*
阀门ID 零件ID 单位用量
------ ------ --------
a      a11           1
a      a22           1
b      b11           1
b      b22           1*/
DROP TABLE bom