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_IDs(数据可以跨越多个层次结构级别)从特定的AGENCY_ID.

4

1 回答 1

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 fiddle http://www.sqlfiddle.com/#!4/3f692/5

于 2013-08-17T15:52:32.923 回答