第一张表母件表 表名(parent)
列值如下:
BOMID parentName
10001   电脑
10002   主机
10003   华硕主板第二张表子件表 表名(child)
列值如下:
BOMID childID childName
10001 C0001 主机
10001   C0002 显示器
10002   C0003 华硕主板
10002   C0004 Intel CPU
10002   C0005 希捷硬盘
10002   C0006 内存
10002   C0007 显卡
10003   C0008 南桥
10003   C0009 北桥
第三张表子件替代料表(replace)
childID replaceID  replaceName
C0004 D0001 AmdCPU
C0005 D0002 西数硬盘
查询母件ParentName=电脑,怎样可得到下表
level id name
+ C0001 主机
++ C0003 华硕主板
+++ C0008 南桥
+++ C0008 北桥
++ C0004 Intel CPU
替代 D0001 AMD CPU
++ C0005 希捷硬盘
替代 D0002 西数硬盘
++ C0006 内存
++ C0007 显卡
+ C0002 显示器

解决方案 »

  1.   


    declare @parent table (BOMID int,parentName varchar(8))
    insert into @parent
    select 10001,'电脑' union all
    select 10002,'主机' union all
    select 10003,'华硕主板'declare @child table (BOMID int,childID varchar(5),childName varchar(13))
    insert into @child
    select 10001,'C0001','主机' union all
    select 10001,'C0002','显示器' union all
    select 10002,'C0003','华硕主板' union all
    select 10002,'C0004','Intel CPU' union all
    select 10002,'C0005','希捷硬盘' union all
    select 10002,'C0006','内存' union all
    select 10002,'C0007','显卡' union all
    select 10003,'C0008','南桥' union all
    select 10003,'C0009','北桥'declare @replace table (childID varchar(5),replaceID varchar(5),replaceName varchar(8))
    insert into @replace
    select 'C0004','D0001','AmdCPU' union all
    select 'C0005','D0002','西数硬盘'select case BOMID when 10001
    then '+' when 10002 then '++' when 10003 then '+++' end  as level,
    childID,childName from @child union all
    select '代替' as level,childID,replaceName from @replace
    order by childID,level
    /*
    level childID childName
    ----- ------- -------------
    +     C0001   主机
    +     C0002   显示器
    ++    C0003   华硕主板
    ++    C0004   Intel CPU
    代替    C0004   AmdCPU
    ++    C0005   希捷硬盘
    代替    C0005   西数硬盘
    ++    C0006   内存
    ++    C0007   显卡
    +++   C0008   南桥
    +++   C0009   北桥
    */
      

  2.   

    hehe 楼上牛 真是苦恼的问题啊
      

  3.   

    不好意思,说明一下,ID并不是顺序的,ID没有任何规律的
      

  4.   

    1.我觉的思路应该是先由母件表得到parentName='电脑'的BOMID
    2.然后查询子件表中的BOMID等于刚刚查询得到的母件表的BOMID,这样可以得到该母件下第一级的子件ID(childID)
    3.根据查第二步查 找到的子件ID查找替代料表中是否存在相同的子件ID,这样可以得到该子件的替代料
    4.根据第二步在子件表中查找到的子件ID,查找到该子件对应的BOMID,然后反查母件表是否存在相同的BOMID,
    若母件中存在相同的BOMID,表名该子件下面仍有子件,这样循环第2,3,4步,依次得到所有件的子件及替代料。实现代码就不知道该怎么去做了
      

  5.   

    用row_number()得到序号,根据序号判断级别,修改上面的代码即可。btw:你的意思太费劲, 没有必要
      

  6.   

    叶子,你好,刚刚发现你提供的sql代码跟我实际要的驱别较大,虽然字段都在里面,但是顺序不符合要求的
    这是我要求实现的效果,每一个母件下面,直接跟自己的下级子件
    level id name
    + C0001 主机
    ++ C0003 华硕主板
    +++ C0008 南桥
    +++ C0008 北桥
    ++ C0004 Intel CPU
    替代 D0001 AMD CPU
    ++ C0005 希捷硬盘
    替代 D0002 西数硬盘
    ++ C0006 内存
    ++ C0007 显卡
    + C0002 显示器
    而不是像这样level childID childName
    ----- ------- -------------
    +     C0001   主机
    +     C0002   显示器
    ++    C0003   华硕主板
    ++    C0004   Intel CPU
    代替    C0004   AmdCPU
    ++    C0005   希捷硬盘
    代替    C0005   西数硬盘
    ++    C0006   内存
    ++    C0007   显卡
    +++   C0008   南桥
    +++   C0009   北桥
    */
      

  7.   

    不要求用一条sql语句,用存储过程或者触发器也行的,只要能实现就好了