2015-12-01 38 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