2013-10-25 3 views
0

다음은 내 테이블얻기 hierarchieal 데이터 - 오라클

PARTY 
ID, PARTY_ID, PARENT_ID 

PARTY_PARTY 
BUYER_ID, SUPPLIER_ID 

PARTY 표는 구매자와 공급자 모두의 기록을 보유하고 있습니다. 구매자는 한 명 이상의 아동 구매자 (어린이 구매자가 PARENT_ID 란을 참조)를 갖게되며, 그 아동 구매자는 차례대로 아동 구매자를 가질 수 있습니다.

각 구매자는 하나 이상의 공급 업체를 보유 할 수도 있으며이 연결은 PARTY_PARTY 테이블에서 추적됩니다. 여기에서 BUYER_ID 열에는 구매자 ID가 저장되고 열에는 공급 업체 ID가 저장됩니다.

나는 주어진 구매자 상기 구매자의 모든 공급 업체를 얻기

SELECT ID FROM party START WITH party_id = 'BUYERX' CONNECT BY PRIOR ID = parent_id; 

을 모든 계층 구매자를 얻기이

같은 모든 구매자와 주어진 구매자의 공급을받을 수 있어요

SELECT ID 
     FROM party 
     WHERE ID IN (
       SELECT SUPPLIER_ID 
       FROM party_party 
       WHERE BUYER_ID IN (
         SELECT ID 
         FROM party START WITH party_id = 'BUYERX' CONNECT BY PRIOR ID = parent_id 
         ) 
       ) 

하지만 문제는 다음과 같습니다. 결과적인 공급 업체가 다른 공급자를위한 구매자. 이 경우 구매자와 구매자가 모두 구매자로 참여하는 구매자와 공급 업체를 어떻게 얻을 수 있습니까?

조회수 나 절차를 사용하고 싶지 않습니다.

샘플 데이터

PARTY 
ID, PARTY_ID, PARENT_ID 
1, BX, NULL 
2, BY, 1 
3, BZ, 1 
4, SA, NULL 
5, SB, NULL 
6, SC, NULL 
7, SD, NULL 
8, SE, NULL 
9, SF, NULL 

PARTY_PARTY 
BUYER_ID, SUPPLIER_ID 
1, 4 
2, 5 
3, 6 
6, 7 
6, 8 
8, 9 
+0

샘플 데이터에 대한 쿼리 결과가 예상 한 결과인지 확인하려면 수정 된 답변을 확인하십시오. –

답변

0

당신은 샘플 데이터를 제공 할 경우가 쉬울 것이다.

WITH 
    party AS (
      SELECT 1 AS id, 'BUYERX' AS party_id, NULL AS parent_id FROM dual 
    UNION SELECT 2 AS id, 'B02' AS party_id, 1 AS parent_id FROM dual 
    UNION SELECT 3 AS id, 'B03' AS party_id, 1 AS parent_id FROM dual 
    UNION SELECT 4 AS id, 'B04' AS party_id, 2 AS parent_id FROM dual 
    UNION SELECT 5 AS id, 'B05' AS party_id, 3 AS parent_id FROM dual 
), 
    party_party AS (
      SELECT 2 AS buyer_id, 5 AS supplier_id FROM dual 
    UNION SELECT 1 AS buyer_id, 4 AS supplier_id FROM dual 
) 
SELECT 
    id, LPAD(' ', (level - 1) * 2) || party_id AS party_id, parent_id, level 
    FROM (
    SELECT id, party_id, parent_id 
     FROM party 
    UNION ALL 
    SELECT supplier_id AS id, 'Supplier' AS party_id, buyer_id AS parent_id 
     FROM party_party 
) 
START WITH party_id = 'BUYERX' 
CONNECT BY PRIOR id = parent_id 
; 

출력 :

 ID PARTY_ID  PARENT_ID LEVEL 
----- -------------- --------- ----- 
    1 BUYERX       1 
    2 B02     1  2 
    4  B04    2  3 
    5  Supplier   2  3 
    3 B03     1  2 
    5  B05    3  3 
    4 Supplier    1  2

편집 샘플 데이터, 내 쿼리가이 출력을 반환 내가 제대로 구매자, 공급 업체와 부모 사이의 관계를 이해하면, 당신은이 솔루션을 시도 할 수 있습니다 :

ID PARTY_ID   PARENT_ID LEVEL 
---- ------------------ --------- ----- 
1 BX        1 
2 BY      1  2 
5  Supplier    2  3 
3 BZ      1  2 
6  Supplier    3  3 
7  Supplier    6  4 
8  Supplier    6  4 
9   Supplier   8  5 
4 Supplier     1  2
+0

@Kruglej - 샘플 데이터 – Pokuri

+0

@ Pokuri를 추가했으며 기대되는 결과를 추가 할 수 있습니까? 내 솔루션을 사용해 보셨습니까? 아무 피드백? –

0

여기에 또 하나의 방법은 CONNECT BY없이입니다 :

WITH 
    party AS ( 
      SELECT 1 AS id, 'BUYERX' AS party_id NULL AS parent_id FROM dual 
    UNION SELECT 2 AS id, 'B02' AS party_id, 1 AS parent_id FROM dual 
    UNION SELECT 3 AS id, 'B03' AS party_id, 1 AS parent_id FROM dual 
    UNION SELECT 4 AS id, 'B04' AS party_id, 2 AS parent_id FROM dual 
    UNION SELECT 5 AS id, 'B05' AS party_id, 3 AS parent_id FROM dual 
), 
    party_party AS ( 
      SELECT 2 AS buyer_id, 5 AS supplier_id FROM dual 
    UNION SELECT 1 AS buyer_id, 4 AS supplier_id FROM dual 
), 
    merged(id,party_id,parent_id)as( 
    SELECT id, party_id, parent_id 
     FROM party 
    UNION ALL 
    SELECT supplier_id AS id, 'Supplier' AS party_id, buyer_id AS parent_id 
     FROM party_party), 
    grouped(par,node,clevel,client)as( 
    select parent_id,id,1,party_id from merged where parent_id is null union all 
    select c.parent_id,c.id,s.clevel+1,lpad(' ',4*s.clevel)||c.party_id 
    from merged c 
    join grouped s on s.node=c.parent_id) 
    select * from grouped order by par nulls first,clevel,node