有两个表:Parent与Component
如果一个物料是由其它物料制作而成,则这个物料在Parent中,其它用来制作的物料在Component中。
但是做成的物料又可以用来制作其它物料。这样一层套一层。我想查找最原始的物料(在Component中存在,但是在Parent不存在)做出的最终成品(在Parent中存在,但是在Component中不存在)。现在最主要就是做出的成品中间可以有多个加工的物料并不要显示。求:最原始的物料最终做成那些成品?

解决方案 »

  1.   

    Parent与Component
    2个表的关系不太明白~~
      

  2.   

    使用层次查询
    start with
    connect by
      

  3.   

    我将Parent与Component连接到一个视图,然后用到2楼方法,但是中间有不是最终的物料“我想查找最原始的物料(在Component中存在,但是在Parent不存在)做出的最终成品(在Parent中存在,但是在Component中不存在)”中间的其它物料都不出来。如何用start with  connect by 来实现
      

  4.   

    select * from Component c where not exists (select 1 from Parent p where c.xxx = p.xxx);select * from Component c where c.xxx not in (select xxx from Patent p);
    不知道你们中间是啥关联关系,你自己看看转成你要的东西吧。 你说的那个关系只是你想要的查询结果,不是表的关联关系。
      

  5.   

    举个例子吧!       以前学习的时候我记得Oracle本身就有一张表SCOTT.EMP  PRESIDENT可以管理几个人MANAGER,然后MANAGER可以管理其它。当然都是一对多的关系。
    由EMPNO和MGR关联  而我现在所做的视图和Scott.emp一样,不过是多对多关系。由PARENT_ID和COMPONENT_ID关联select lpad(level,level*3,' '),spci.COMPONENT_ITEM,spci.PARENT_ITEM
      from Item spci
    connect by prior spci.COMPONENT_ID = spci.PARENT_ID
     start with spci.PARENT_ITEM = :P_ITEM求出来的数据我不需要中间的那些层。 例如:我只要PRESIDENT管理的最下层人员
      

  6.   


    --添加一层查询,伪造一个层级出来,然后只显示最低层级和最高层级。
    WITH t AS
      (SELECT '总原料1' AS code,
        10000        AS amount,
        0            AS res,
        1            AS dist,
        '总用途1'       AS costType
      FROM dual
      UNION ALL
      SELECT '原料1',500,1,2,'用途1' FROM dual
      UNION ALL
      SELECT '原料2', 1000, 2 ,3, '用途2' FROM dual
      UNION ALL
      SELECT '原料3', 2000, 2 ,4, '用途3' FROM dual
      UNION ALL
      SELECT '总原料2', 5000, 0, 5 ,'总用途2' FROM dual
      UNION ALL
      SELECT '原料4', 100, 5 ,6, '用途4' FROM dual
      UNION ALL
      SELECT '原料5', 100, 6 ,7, '用途5' FROM dual
      )
    SELECT *
    FROM
      (SELECT code,
        amount,
        res,
        dist,
        costtype,
        level AS lvl
      FROM t
        START WITH res = 0
        CONNECT BY res = prior dist
      )
    WHERE lvl = 1
    OR lvl    =
      (SELECT MAX(lvl) FROM (
      SELECT code,
        amount,
        res,
        dist,
        costtype,
        level AS lvl
      FROM t
        START WITH res = 0
        CONNECT BY res = prior dist) a
      ) 
      

  7.   


    select lpad(level,level*3,' '),spci.COMPONENT_ITEM,spci.PARENT_ITEM
      from Item spci
    where connect_by_isleaf = 1
    connect by prior spci.COMPONENT_ID = spci.PARENT_ID
     start with spci.PARENT_ITEM = :P_ITEM
      

  8.   

    select lpad(level,level*3,' '),spci.COMPONENT_ITEM,spci.PARENT_ITEM
      from Item spci
    where connect_by_isleaf = 1
    connect by prior spci.COMPONENT_ID = spci.PARENT_ID
     start with spci.PARENT_ITEM = :P_ITEM楼上这种方法非常好,但是一次只能求出一个 :P_ITEM 。我有很多这样的树,一下怎么全部求出来呢
      

  9.   

    意思我懂了。Component存放的是半成品和最原始的原料,半成品可以制成成品存放在parent表中,而parent表中还存放有Component中最原始原料制成的半成品。parent表中的记录跟Component表中是一对多的关系!两个表中应该有相同记录吧?去除掉的话,就剩下父节点(最顶层的),和叶节点(最下层的)!
      

  10.   

    http://blog.csdn.net/wzy0623/article/details/1644049在这里找到答案了