2015-12-01 36 views
1

我正在尝试编写一个分层代码,除了所有子/父帐户还会显示一个列,其中包含表TO_DELETE此帐户(子/父母)根据。 换句话说:根据表TO_DELETE中的哪个帐户显示父/子帐户?有关基于哪个值的信息的分层查询

我的代码如下:

WITH acc_to_delete(ID) AS (
          select parentaccount from account where accountid in           
           (select accountid from to_delete) 
         ) 
          SELECT accountid id_acc 
          FROM account p 
          START WITH 
          EXISTS(SELECT 'X' 
            FROM to_delete w 
            WHERE p.accountid = w.accountid 
            ) 
          CONNECT BY accountid = PRIOR parentaccount 
          union 
          SELECT accountid id_acc 
          FROM account p 
          START WITH 
          EXISTS(SELECT 'X' 
            FROM to_delete w 
            WHERE p.accountid = w.accountid 
            ) 
          CONNECT BY prior accountid = parentaccount 

它似乎正常工作。结果我得到了一个树帐户。至少我认为:)

CREATE TABLE to_delete 
(accountid number); 
CREATE TABLE account 
(accountid number, 
    parentaccount number) 

所以现在当to_delete表包含数据:

3123, 
    3443, 
    5646, 
    7563, 
    3452, 
    2346 

和帐户包含:

Accountid parentaccount 
    3123   5533 
    3443   3452 
    5646   4342 
    7563   1239 
    3452   5533 
    2346   1230 
    5533   6474 
    6474   1231 
    1231   1293 
    1293   null 

然后输出应外观:

accountid based on 
     3123 3123  
     5533 3123  
     6474 3123 
     1231 3123 
     1293 3123 
     3443 3443 
     3452 3443 
     6474 3443 
     1231 3443 
     1293 3443 
     5646 5646 
     4342 5646 
     7563 7563 

等。 是否可以在SQL中执行?或者我需要使用pl sql?

回答

1

阅读有关``CONNECT_BY_ROOT`操作:
http://docs.oracle.com/cd/B19306_01/server.102/b14200/operators004.htm#i1035022

例如在此查询:

SELECT p.accountid, CONNECT_BY_ROOT p.accountid as based_on 
FROM account p 
START WITH p.accountid IN (select accountid from to_delete) 
CONNECT BY accountid = PRIOR parentaccount 

由查询CONNECT_BY_ROOT p.accountid返回从根行返回的accountid值每行(换句话说 - 从符合START WITH条件的行开始,作为层次结构的起始行)。

+0

谢谢kordirko! :)我还有一个问题,你可以看看我的代码进行分层查询吗?我认为这是好的,但有一些重复的问题,我不知道如果我做得那么正确... – bazyl