请大虾帮助,关于BOM的问题原贴
http://topic.csdn.net/u/20100404/15/6c440190-12aa-47d3-9c39-058212830b9a.html?69939物料清单如下,很显然有个物料包含的死循环   A-B-C-A 
            A 
          /   \ 
        B      | 
      /   \   /
    C       D 
  /       /   \ 
A       E       F 如何编写程序快速的找出这样的循环?实际应用中物料清单很庞大,级数也很多。BOM表 
物品id     部件id     需要数量     替代部件(等其他字段) 
A               B             1 
A               D             1 
B               C             1 
C               A             1 
D               E             1 
D               F             1 

解决方案 »

  1.   

    用的是什么数据库,oracle里可以用层次化查询
    select t.* from table1 t
    where connect_by_iscycle='1'
    start with not exists(select 1 from table1 where 部件id=t.物品id)
    connect by nocycle prior 部件id=物品id
      

  2.   

    sqlserver可以通过写一个存储过程来处理
      

  3.   

    ORACLE 可以有几种方式:1)使用connect by
       在使用connect by 时,如果不指定nocycle, ORACLE在检测出有死循环时就报会异常,只要获取这个异常就说明有死循环
     
       此种方式代码少,效率好。2)自已写代码实现相应的算法来检测
       楼主的这个CASE,跟数据结构里的“怎样快速检测出一个巨大的单链表中是否具备死链及其位置”是完全一样的,只需要把相关的算法写成PL-sql即可。
       可参考:http://hi.baidu.com/moon_yly/blog/item/d104aa57c473adcfb745aeca.html另外,以后提问题请给出create table, insert into, 以方便我们快速处理问题
      

  4.   

    不过计算的结果里面有个
    C A C->A->B->D->C
    实际上应该没有这个循环。 
    --------------------------
    我又看了下
    多了个D 是由于父级A有BD两个子级引起的按逻辑看
    C是存在一个循环的:
    C->A->B->C楼主的意思是不是C已经存在于A的循环中了 所以只需要A就OK,不需要选出C?
    ...