2013-08-17 74 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 s(數據可以跨越多個級別的層次結構)從特定的AGENCY_ID開始。

+0

做了一些研究條款「的連接」。 – OldProgrammer

回答

0

編輯:對不起,以爲ABC是DEF的父,但檢查了一遍,看到你說的,DEF是ABC的母公司,所以,我按

改變了我回答這個表結構是有點怪,兩個表會足夠了。但是不要介意。

分級查詢在包含對自身的引用的表上執行。因此,您需要在這裏加入這些表以獲得單個結果集並通過分層查詢執行連接。

考慮到您正在尋找特定記錄的父母。說這是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'; 

另一方面。如果你想看到整個表的話。嘗試下面的查詢。

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  

給你的SQL搗鼓你的榜樣http://www.sqlfiddle.com/#!4/3f692/5

+0

非常感謝.....這正是我想要的 – Shovan