2

私が取り組んでいる現在のプロジェクトでは、奇妙な状況に遭遇しました。次のテーブル構造を考慮してください。

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.

4

1 に答える 1

0

編集: 申し訳ありませんが、ABC は DEF の親であると考えていましたが、もう一度確認したところ、DEF は ABC の親であると表示されたので、それに応じて回答を変更しました

このテーブル構造は少し奇妙で、2 つのテーブルで十分です。しかし、気にしないでください。

階層クエリは、それ自体への参照を含むテーブルに対して実行されます。したがって、ここで必要なのは、これらのテーブルを結合して単一の結果セットを取得し、それに対して階層クエリによる接続を実行することです。

特定のレコードの親を探しているとします。これが 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

于 2013-08-17T15:52:32.923 に答える