小弟分不多,真诚请教大侠们一个SQL问题,希望大侠们不吝赐教,小弟在此不甚感激。
有一张表记录物料  如下:(10C是父物料,30C是10C的子物料【30C本身也是父物料】
70C是30C的子物料【70C本身也是父物料】)
ITEMPARENT_CD   ITEMCHILD_CD  BOM_SQ ……ITEMPARENT_CD是主键
   10CA0001      30CA0001       1
   10CA0001      065A0001       2
   10CA0001      085A0001       3
   30CA0001      70CA0001       4
   30CA0001      021A0001       5
   70CA0001      011A0001       6
现在要一条sql语句根据10C查询出所有他的子物料(同时加上一个等级Level字段)
效果如下:查询条件是10CA0001
Level    ITEMCHILD_CD
  1       30CA0001
  2       70CA0001
  3       011A0001
  2       021A0001
  1       065A0001
  1       085A0001
真诚请教大侠们该怎么实现?

解决方案 »

  1.   

    USE tempdb
    GO-- 建立演示环境
    CREATE TABLE Dept(
     id int PRIMARY KEY, 
     parent_id int,
     name nvarchar(20))
    INSERT Dept
    SELECT 0, 0, N'<全部>' UNION ALL
    SELECT 1, 0, N'财务部' UNION ALL
    SELECT 2, 0, N'行政部' UNION ALL
    SELECT 3, 0, N'业务部' UNION ALL
    SELECT 4, 0, N'业务部' UNION ALL
    SELECT 5, 4, N'销售部' UNION ALL
    SELECT 6, 4, N'MIS' UNION ALL
    SELECT 7, 6, N'UI' UNION ALL
    SELECT 8, 6, N'软件开发' UNION ALL
    SELECT 9, 8, N'内部开发'
    GO-- 查询指定部门下面的所有部门
    DECLARE @Dept_name nvarchar(20)
    SET @Dept_name = N'MIS'
    ;WITH
    DEPTS AS(
     -- 定位点成员
     SELECT * FROM Dept
     WHERE name = @Dept_name
     UNION ALL
     -- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归
     SELECT A.*
     FROM Dept A, DEPTS B
     WHERE A.parent_id = B.id
    )
    SELECT * FROM DEPTS
    GO-- 删除演示环境
    DROP TABLE Dept
      

  2.   

    CTE实现递归 没环境 参考下1楼
      

  3.   

    用asp.net程序实现也可以,可不可以提供一个思路和代码
      

  4.   

    DECLARE @TB TABLE
    (
    ITEMPARENT_CD  VARCHAR(8),
    ITEMCHILD_CD VARCHAR(8),
    BOM_SQ INT
    ) INSERT INTO @TB
    VALUES('10CA0001','30CA0001',1),
    ('10CA0001','065A0001',2),
    ('10CA0001','085A0001',3),
    ('30CA0001','70CA0001',4),
    ('30CA0001','021A0001',5),
    ('70CA0001','011A0001',6)
    with ITEMCHILD
    as
    (
    select  1 as rowid, ITEMCHILD_CD,ITEMPARENT_CD,BOM_SQ from @TB where ITEMPARENT_CD='10CA0001'
    union all
    select t1.rowid+1 as rowid, t2.ITEMCHILD_CD,t2.ITEMPARENT_CD,t2.BOM_SQ
    from ITEMCHILD t1 join @TB t2 on t1.ITEMCHILD_CD=t2.ITEMPARENT_CD
    )
    select * from ITEMCHILD order by BOM_SQ
      

  5.   

    已经解决了,思路和6楼一样,通过cte递归的方法