2012-02-13 4 views
3

私はこれはこれはWITH STARTとOracle SQLのCONNECT BY

select lpad(' ', 2*level) || A.ACCOUNT_ID AS LEVEL_LABEL, 
      LEVEL, 
      A.* 
     from ACCOUNT A 
start with PARENT_ACCOUNT_ID IN 
         (select PARENT_ACCOUNT_ID 
          from ACCOUNT 
         where ACCOUNT_ID IN 
             (select PARENT_ACCOUNT_ID 
              from ACCOUNT 
              where parent_account_id != account_id) 
              and ACCOUNT_ID = PARENT_ACCOUNT_ID) 
    CONNECT BY NOCYCLE PRIOR A.ACCOUNT_ID = A.PARENT_ACCOUNT_ID; 
私のクエリでDDL

CREATE TABLE "SYSTEM"."ACCOUNT" 
("CUSTOMER_ID"  NUMBER(20,0) NOT NULL ENABLE, 
"PAYING_ACCOUNT_ID" NUMBER(20,0), 
"PARENT_ACCOUNT_ID" NUMBER(20,0), 
"ACCOUNT_ID"  NUMBER, 
"COMPANY_ID"  NUMBER) 

ある

CUSTOMER_ID PAYING_ACCOUNT_ID PARENT_ACCOUNT_ID  ACCOUNT_ID COMPANY_ID 
24669   24669    24669     24669  0 
24671   24671    24669     24671  0 
24670   24670    24669     24670  0 
3385217  3385217    24670     3385217  0 
158   158     158     158   0 
159   159     158     159   0 
160   160     159     160   0 
161   161     160     161   0 
162   162     160     162   0 
180   180     180     180   0 

以下のアカウントとしてテーブルを持っています

クエリの主な目的は、PARENT_ACCOUNT_ID & ACCOUNT_IDの階層関係を持つデータを選択することですが、クエリによって重複したデータが返されます。

アドバイスをいただければ幸いです。おかげ

+1

parent_account_idとaccount_idはどのように異なっていて、同じ時間(ほとんどの内部クエリ)で等しいことができますか?これは正確に0の結果を生成する必要があるため、おそらくオリジナルのクエリではないため、重複はまったくありません。 – Benoit

答えて

6

なぜ単に:

SELECT level, * FROM accounts 
START WITH parent_account_id = account_id 
CONNECT BY PRIOR account_id = parent_account_id 
     AND account_id <> parent_account_id 

+0

あなたのアドバイスをありがとう。 – user871695

+0

@ user871695この回答は機能しますか? – cctan

+0

はいそれは働いた:) – user871695

0

pl/sql HOSTコマンドを使用して.exeファイルを呼び出すことができます。

関連する問題