2013-08-17 2 views
2

현재 작업중인 프로젝트에서 필자는 특별한 상황을 경험했습니다. 다음 표 구조를 고려하시기 바랍니다 : 아래 여러 테이블에 걸친 Oracle 계층 적 쿼리

AGY_AGENCY (
    AGENCY_ID  NUMBER(9) not null, 
    AGENCY_CD  VARCHAR2(30) not null, 
    AGC_LEG_CD  VARCHAR2(30) not null, 
    ........................ 
) 

AGY_RELN (
    AGY_RELN_ID   NUMBER(9) not null, 
    AGENCY_ID    NUMBER(9) not null, -- Refers to AGY_AGENCY.AGENCY_ID 
    RELATIONSHIP_LINK_TYPE VARCHAR2(30) not null, 
    ............................ 
) 

AGY_REL_AGENCY (
    REL_AGY_ID  NUMBER(9) not null, 
    AGY_RELN_ID  NUMBER(9) not null, -- Refers to AGY_RELN.AGY_RELN_ID 
    RELN_AGENCY_ID NUMBER(9) not null, -- Refers to AGY_AGENCY.ACY_AGENCY_ID 
    ............................... 
) 

는 샘플 데이터

이 데이터 당으로
AGY_AGENCY 

AGENCY_ID AGENCY_CD AGC_LEG_CD 
-------------------------- 
1000,  'ABC', 'ABC' 
1001,  'DEF', 'DEF' 

AGY_RELN 

AGY_RELN_ID AGENCY_ID RELATIONSHIP_LINK_TYPE 
----------------------------------------------- 
2000,  1000,  'PARENT_OUTLET' 

AGY_REL_AGENCY 

REL_AGY_ID AGY_RELN_ID RELN_AGENCY_ID 
-------------------------------------------- 
3000,  2000,   1001 

이다,기구 "DEF"는 "ABC"의 부모 출구 기관입니다.

모든 부모, 조부모를 반환하는 SQL 쿼리를 공식화해야합니다. 특정 AGENCY_ID부터 시작하여 AGENCY_ID (데이터는 여러 계층의 계층에 걸쳐있을 수 있음).

+0

은 SQL 바이올린 있습니다에 대한 몇 가지 연구를 수행 절 "하여 연결". – OldProgrammer

답변

0

편집 : 죄송합니다, 두 개의 테이블이 것, ABC는 DEF의 부모 생각했지만, 다시 확인하고 당신이 말하는보고, DEF는 ABC의 부모, 그래서이 테이블 구조가 조금 이상하다 따라

내 대답을 변경 아주 충분 해. 하지만 그것에 대해 신경 쓰지 마라.

계층 적 쿼리는 자체에 대한 참조를 포함하는 테이블에서 실행됩니다. 따라서 여기에 필요한 것은 이러한 테이블을 조인하여 하나의 결과 집합을 가져 와서 계층 적 쿼리로 연결을 실행하는 것입니다.

특정 레코드의 부모를 찾고 있다고 생각하십시오. that is agency_cd = 'ABC'이것이 당신이 그것을 얻는 방법입니다. 한편,

select agency_id, agency_cd, level from (
--Below query will join three tables to get a record and its parent id side-by-side in a row  
SELECT ag.*, rlag.reln_agency_id AS parent_agency_id 
     FROM agy_agency ag, agy_reln rl, agy_rel_agency rlag 
     WHERE ag.agency_id = rl.agency_id (+) 
      AND rlag.agy_reln_id(+) = rl.agy_reln_id  
) t 
where agency_cd <> 'ABC' --discard the record you are looking for itself 
connect by agency_id = prior parent_agency_id -- Connect by is executed before where clause, don't worry about where clause 
start with agency_cd = 'ABC'; 

한편으로는. 너가 전체적인 테이블을 hieararchically보고 싶으면. 아래 쿼리를 시도하십시오.

select agency_id, agency_cd, prior agency_id as parent_agency_id, prior agency_cd  as parent_agency_cd, level from (
    SELECT ag.*, rlag.reln_agency_id AS parent_agency_id 
     FROM agy_agency ag, agy_reln rl, agy_rel_agency rlag 
     WHERE ag.agency_id = rl.agency_id (+) 
      AND rlag.agy_reln_id(+) = rl.agy_reln_id 
) t 
connect by prior agency_id = parent_agency_id 
start with parent_agency_id is null  

여기에 당신은 당신의 예를 http://www.sqlfiddle.com/#!4/3f692/5

+0

고마워 ..... 내가 원했던 것이었다. – Shovan