2016-10-28 15 views
2

ユーザーIDを持つテーブルと、階層要素を持つテーブルがあります。ユーザーIDを持つ表には、階層要素を持つ表に対する固有のキーがあります。私が達成しようとしているのは、ユーザごとに 階層テーブルのすべての要素を表示することです。問題は、私が横断して表示する必要がある階層ノードがあることです。使用しているテーブルと使用しているデータの例を以下に示します。階層継承によるクエリ

create table fsecure(
userid varchar(100), 
f_element varchar(6) 
); 

REM INSERTING into FSECURE 
SET DEFINE OFF; 
Insert into FSECURE (USERID,F_ELEMENT) values ('FFA','140'); 
Insert into FSECURE (USERID,F_ELEMENT) values ('FFA','280'); 
Insert into FSECURE (USERID,F_ELEMENT) values ('GGA','202118'); 
Insert into FSECURE (USERID,F_ELEMENT) values ('GGA','140'); 
Insert into FSECURE (USERID,F_ELEMENT) values ('RFA','202116'); 



CREATE TABLE "FVAL" 
    ("FUND" VARCHAR2(6), 
    "FUND_PRED" VARCHAR2(6) 
    ) 

REM INSERTING into FVAL 
SET DEFINE OFF; 
Insert into FVAL (FUND,FUND_PRED) values ('140',null); 
Insert into FVAL (FUND,FUND_PRED) values ('280',null); 
Insert into FVAL (FUND,FUND_PRED) values ('2000','140'); 
Insert into FVAL (FUND,FUND_PRED) values ('20001','2000'); 
Insert into FVAL (FUND,FUND_PRED) values ('20002','2000'); 
Insert into FVAL (FUND,FUND_PRED) values ('20003','2000'); 
Insert into FVAL (FUND,FUND_PRED) values ('202118','2000'); 
Insert into FVAL (FUND,FUND_PRED) values ('2800','280'); 
Insert into FVAL (FUND,FUND_PRED) values ('280001','2800'); 
Insert into FVAL (FUND,FUND_PRED) values ('280002','2800'); 
Insert into FVAL (FUND,FUND_PRED) values ('280003','2800'); 
Insert into FVAL (FUND,FUND_PRED) values ('280004','2800'); 

ここでは、私があなたのためにこれをやっているときに働くクエリです。

SELECT  F.FUND 
    FROM  FVAL F 
    CONNECT BY PRIOR F.FUND = F.FUND_PRED 
    START WITH F.FUND IN (SELECT F_ELEMENT FROM FSECURE WHERE USERID = 'FFA'); 

これは、すべてのユーザーがfsecureから要素を表示するのに十分な汎用性を持たせたいと考えています。

予想出力(注:私は一人のユーザーを示していますが、私は、テーブルfsecure上のすべてのユーザーのためにこれを行うしたいと思います)

"FUND" "'FFA'" 
"140" "FFA" 
"2000" "FFA" 
"20001" "FFA" 
"20002" "FFA" 
"20003" "FFA" 
"202118" "FFA" 
"280" "FFA" 
"2800" "FFA" 
"280001" "FFA" 
"280002" "FFA" 
"280003" "FFA" 
"280004" "FFA" 

任意の助けいただければ幸いです。

+1

DDLステートメントを提供していただき、ありがとうございます。 * {: - D – Boneist

答えて

2

をした後:

SELECT  fv.fund, 
      connect_by_root(fs.userid) userid 
FROM  fval fv 
      FULL OUTER JOIN fsecure fs ON (fs.f_element = fv.fund) -- maybe left outer join? 
CONNECT BY PRIOR fv.fund = fv.fund_pred 
START WITH fs.userid IS NOT NULL 
ORDER BY connect_by_root(fs.userid), 
      connect_by_root(fs.f_element), 
      LEVEL, 
      fv.fund; 

FUND USERID 
------ ------ 
140 FFA 
2000 FFA 
20001 FFA 
20002 FFA 
20003 FFA 
202118 FFA 
280 FFA 
2800 FFA 
280001 FFA 
280002 FFA 
280003 FFA 
280004 FFA 
140 GGA 
2000 GGA 
20001 GGA 
20002 GGA 
20003 GGA 
202118 GGA 
202118 GGA 
     RFA 

N.B. fvalテーブルに対応するファンドがないため、RFAユーザーIDを出力に表示するかどうかはわかりませんでした。出力にRFAユーザーIDを必要としない場合は、完全外部結合を左外結合に変換するだけです。

+1

lol - どこにでも自分の質問を投稿するこれらの人々が大好きです。基本的にはOTNと同じソリューションを提供しました(階層的な問合せを最初に行い、その後に参加しただけです)。階層的な部分で多くのデータをシャッフルしないという利点があります。私は内部結合を推測しましたが、要件に応じて代替として左外部結合を提供しました。 (完全な私の心を渡っていない。)乾杯! – mathguy

+1

@mathguy私はあなたの答えがマイケルズに似ていたと思っていますか? OPクロスがこれを投稿した場所にかかわらず、私は尋ねることなくDDLステートメントを持っていたことに驚いています! – Boneist

+1

このソリューションは、実際にMichael'sに非常によく似ています。再:データを再作成するステートメント、OTNの人々はより多くのポスターからそれを得ることで成功している。フォーマットはそれにも役立ちます - だから少し窮屈です。そして、それをテストせずに回答を投稿しようとするSOの方が多くあります。 OTNではそれほど多くはありません。 – mathguy

2

まあ、私はあなたが何か使用することを理解するよう:私は、これはあなたが何をしているんだと思う

SELECT s.USERID, hier_f.FUND 
    FROM FSECURE s 
    JOIN ( SELECT F.FUND, connect_by_root(F.FUND) as root_fund 
    FROM FVAL F 
    CONNECT BY PRIOR F.FUND = F.FUND_PRED 
    START WITH F.FUND IN (SELECT F_ELEMENT FROM FSECURE)) hier_f 
    on s.F_ELEMENT = hier_f.root_fund 
関連する問題