2016-08-02 1 views
0

테이블이 있지만 트리를 추출하는 관계를 쓸 수 없습니다. 여기 Oracle에서 계층 적 쿼리를 생성하는 방법은 무엇입니까?

데이터의 예는 다음과 같습니다

LOT_ID | LOT_PRODUCED | ITEM_PRODUCED | ITEM_USED | LOT_USED | OPERATION | STEP 
------ | ------------ | ------------- | --------- | -------- | --------- | ---- 
1  | LOT_1  | ITEM_1  | null  | null  | P   | STEP_1 
1  | null   | null   | ITEM_1 | LOT_1 | C   | STEP_2 
5  | null   | null   | ITEM_2 | LOT_2 | C   | STEP_2 
5  | LOT_2  | ITEM_2  | null  | null  | P   | STEP_8 
5  | null   | null   | ITEM_2 | LOT_2 | C   | STEP_1 
6  | null   | null   | ITEM_2 | LOT_7 | C   | STEP_8 

LOT_PRODUCED = LOT_1에서 시작, 나는 시작의 많은 단계에 링크 모든 단계에 나무를 가지고 싶습니다.

이 예에서 STEP_1 (LOT_1을 생성 한 단계)은 LOT_2를 소비합니다. 이 로트는 STEP_8에서 생성되었습니다. 이 단계는 차례로 LOT_7을 소모합니다. 등등.

START WITH 및 CONNECT BY의 개념을 이해한다고 생각하지만 링크가 열 사이에서 '점프'되므로이 경우를 해결할 수 없습니다. 정의 된 부모와 자식이 없습니다.

간단한 쿼리로 해결할 수없는 경우 저장 프로 시저에 대해 열려 있습니다.

편집 : Here is a drawing of the data shown above

그래서 왼쪽에있는 링크의 설명이 있습니다 : 단계가 많이 생산

  • 단계에서 소비

    • 많은

    오른쪽에 링크가 있습니다 : conn의 번호 ectors는 위에 표시된 데이터의 행 번호입니다.

  • +0

    진흙 투성이.어떤 행에서 LOT_1이 (가) LOT_2를 소비하는지 나타냅니다. 직접 또는 다른 행 체인에 의해 테이블 ​​사이에 연결이 표시되는 행이 없습니다. (있을 경우 설명해주세요.) – mathguy

    +0

    로트, 아이템 및 단계라는 세 개의 엔티티가있는 것처럼 보입니다. 그러나 나는이 것들 사이의 관계가 무엇인지 명확하지 않다고 생각합니다. 당신이 질문을 편집하여 (대략)이 것들이 무엇인지 나타낼 수 있습니까? 아이템을 만드는 단계, 아이템을 사용하는 단계 및 많이 사용하는 단계처럼 보입니다. 명확히 해 주시겠습니까? – halfer

    +0

    질문에 포함 된 그래픽 표현이 문제를 설명하는 데 도움이 될 수 있습니다. – halfer

    답변

    0

    것은 내가 쿼리 마련했습니다

    SELECT DISTINCT G.STEP, 
        LOT_USED, 
        ITEM_USED, 
        LOT_PRODUCED, 
        ITEM_PRODUCED 
    FROM GENEALOGY G 
        START WITH G.STEP  = 'STEP01' 
        CONNECT BY LOTPRODUCED = PRIOR LOTUSED 
    AND ITEMPRODUCED   = PRIOR ITEMUSED 
    ORDER BY G.STEP 
    

    하지만이 첫 번째 소비의 수준 반환 시작 단계에서 을, 나는 많이 소비 취득하고이 많이마다, 나는 얻을 그것을 만든 단계. 나는 또한 시작 단계에서 생산 된 로트를 얻는다.

    SELECT DISTINCT H.STEP, 
        LOTUSED, 
        ITEMUSED, 
        LOTPRODUCED, 
        ITEMPRODUCED 
    FROM GENEALOGY H 
        START WITH H.STEP IN 
        (SELECT DISTINCT G.STEP 
        FROM GENEALOGY G 
         START WITH G.STEP = 'STEP_1' 
         CONNECT BY LOTPRODUCED = PRIOR LOTUSED 
        AND ITEMPRODUCED   = PRIOR ITEMUSED 
        ) 
        CONNECT BY LOTPRODUCED = PRIOR LOTUSED 
    AND ITEMPRODUCED   = PRIOR ITEMUSED 
    ORDER BY H.STEP 
    

    I :

    STEP | LOT_USED | ITEM_USED | LOT_PRODUCED | ITEM_PRODUCED 
    -------|----------|-----------|--------------|--------------- 
    STEP_1 | LOT_2 | ITEM_2 |    | 
    STEP_1 |   |   | LOT_1  | ITEM_1 
    STEP_8 |   |   | LOT_2  | ITEM_2 
    

    내가 다음 하위 쿼리와 같은 기존의 일부를 포함하는 쿼리를 변경 :

    내 예를 들어, 데이터, 내가 (STEP_1부터) 취득으로 연결하려면 그런 다음 2 단계의 소비를하십시오.

    , 나는 (STEP_1부터 시작) 얻을 내 예를 데이터로 연결하려면 :
    STEP | LOT_USED | ITEM_USED | LOT_PRODUCED | ITEM_PRODUCED 
    -------|----------|-----------|--------------|--------------- 
    STEP_1 | LOT_2 | ITEM_2 |    | 
    STEP_1 |   |   | LOT_1  | ITEM_1 
    STEP_8 |   |   | LOT_2  | ITEM_2 
    STEP_8 | LOT_7 | ITEM_2 |    | 
    

    그래서 내가 쿼리에 존재하여 연결 등 소비의 많은 수준을 얻을 수 있습니다. 하지만 나는 물론 풀 나무를 얻고 싶습니다. 나는 레벨의 수를 미리 알지 못한다. 심지어 그것이 예를 들어 30이라는 것을 알았다고하더라도, 나의 쿼리는 아무런 이유없이 "거대한"것이 될 것이다.

    내 문제에 대해 더 간단한 쿼리를 작성하는 데 도움이되는 아이디어가 있습니까? 아마도 P (생산) 및 C (소비) 운영 필드와 LOT_ID?