2017-12-17 10 views
0

私は3つのテーブルを持っています。ユーザーとそのユーザーに割り当てられている要素が含まれています。表DDLはこのように見えます。複数の条件で階層を結合する

CREATE TABLE FSECURE 
    ( "USERID" VARCHAR2(100 BYTE), 
    "F_ELEMENT" VARCHAR2(6 BYTE), 
    "O_ELEMENT" VARCHAR2(20 BYTE), 
    "TYPE" VARCHAR2(20 BYTE) 
    ); 

テーブルに含まれるデータは次のようになります。

REM INSERTING into FSECURE 
SET DEFINE OFF; 
Insert into FSECURE (USERID,F_ELEMENT,O_ELEMENT,TYPE) values ('FFA','140','2003','APP1'); 
Insert into FSECURE (USERID,F_ELEMENT,O_ELEMENT,TYPE) values ('FFA','280','2003','APP1'); 
Insert into FSECURE (USERID,F_ELEMENT,O_ELEMENT,TYPE) values ('GGA','202118','2003','APP2'); 
Insert into FSECURE (USERID,F_ELEMENT,O_ELEMENT,TYPE) values ('GGA','140','2004','APP2'); 
Insert into FSECURE (USERID,F_ELEMENT,O_ELEMENT,TYPE) values ('RFA','202116','3662','APP3'); 
Insert into FSECURE (USERID,F_ELEMENT,O_ELEMENT,TYPE) values ('FFA','110001','3662','APP3'); 

fvolテーブルはf_secureテーブルのo_element列への参照を含みます。

CREATE TABLE FVOL 
     ( "ORG" VARCHAR2(6 BYTE), 
     "ORG_PRED" VARCHAR2(6 BYTE) 
     ); 

REM INSERTING into FVOL 
SET DEFINE OFF; 
Insert into FVOL (ORG,ORG_PRED) values ('2003',null); 
Insert into FVOL (ORG,ORG_PRED) values ('3661','2003'); 
Insert into FVOL (ORG,ORG_PRED) values ('3662','2003'); 
Insert into FVOL (ORG,ORG_PRED) values ('2009',null); 
Insert into FVOL (ORG,ORG_PRED) values ('366X','2009'); 
Insert into FVOL (ORG,ORG_PRED) values ('366P','2009'); 
Insert into FVOL (ORG,ORG_PRED) values ('2004',null); 
Insert into FVOL (ORG,ORG_PRED) values ('1114','2004'); 
Insert into FVOL (ORG,ORG_PRED) values ('2224','2004'); 
fval

テーブルはfsecureテーブル内f_elementへの参照を含みます。

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



    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'); 
Insert into FVAL (FUND,FUND_PRED) values ('110001','11000'); 
Insert into FVAL (FUND,FUND_PRED) values ('110002','11000'); 

私が抱えている問題は、私は ユーザによって階層を横断する必要があることである - f_element - o_element - で階層ノードを有するUSER_ID FFAの場合に例えばだからタイプ

fsecureF_ELEMENT = '140'O_ELEMENT = '2003'として表し、ちょうどその行のTYPE APP1 私は サンプル出力を取得する必要があります。

FUND:  ORG:   TYPE: 
20001  3661   APP1 
20002  3661   APP1 
20003  3661   APP1 
202118 3661   AAP1 

20001  3662   AAP1 
20002  3662   AAP1 
20003  3663   APP1 
202118 3663   AAP1 
110001 3662   AAP3 

問題は、階層型、ユーザーID、f_element、o_elementを走査していることです。私は階層をたどることができますが、私は要素を組み合わせることなくどのようにそれを行うかについての精神的なブロックを持っています。 Note: FFA USER FOR APP3は、その行の一部として140と2003を持たないため、1つのf_elementとo_elementを取得します。

答えて

1

@Miguelは、ここで

WITH v_fval 
AS 
(SELECT fund, r_fund 
    FROM (SELECT fund, 
       connect_by_root fund AS r_fund, 
       connect_by_isleaf AS l_fund 
      FROM fval 
     START WITH fund_pred IS NULL 
     CONNECT BY PRIOR fund = fund_pred) 
    WHERE l_fund = 1) 
, v_fvol 
AS 
(SELECT org, r_org 
    FROM (SELECT org, 
       connect_by_root org AS r_org, 
       connect_by_isleaf AS l_org 
      FROM fvol 
      START WITH org_pred IS NULL 
      CONNECT BY PRIOR org = org_pred) 
    WHERE l_org = 1) 
SELECT fsecure.userid, 
     NVL(v_fvol.org, fsecure.o_element) AS org, 
     NVL(v_fval.fund, fsecure.f_element) AS fund, 
     fsecure.type 
    FROM fsecure LEFT JOIN v_fvol 
       ON (fsecure.o_element = v_fvol.r_org) 
       LEFT JOIN v_fval 
       ON (fsecure.f_element = v_fval.r_fund) 
WHERE fsecure.userid = 'FFA' 
ORDER BY fsecure.userid, v_fvol.org, v_fval.fund ; 

出力が

USERID ORG FUND TYPE 
FFA 3661 20001 APP1 
FFA 3661 20002 APP1 
FFA 3661 20003 APP1 
FFA 3661 202118 APP1 
FFA 3661 280001 APP1 
FFA 3661 280002 APP1 
FFA 3661 280003 APP1 
FFA 3661 280004 APP1 
FFA 3662 20001 APP1 
FFA 3662 20002 APP1 
FFA 3662 20003 APP1 
FFA 3662 202118 APP1 
FFA 3662 280001 APP1 
FFA 3662 280002 APP1 
FFA 3662 280003 APP1 
FFA 3662 280004 APP1 
FFA 3662 110001 APP3 

説明以下の通りであるクエリ

データ

CREATE TABLE FSECURE 
    ( "USERID" VARCHAR2(100 BYTE), 
    "F_ELEMENT" VARCHAR2(6 BYTE), 
    "O_ELEMENT" VARCHAR2(20 BYTE), 
    "TYPE" VARCHAR2(20 BYTE) 
    ); 
Insert into FSECURE (USERID,F_ELEMENT,O_ELEMENT,TYPE) values ('FFA','140','2003','APP1'); 
Insert into FSECURE (USERID,F_ELEMENT,O_ELEMENT,TYPE) values ('FFA','280','2003','APP1'); 
Insert into FSECURE (USERID,F_ELEMENT,O_ELEMENT,TYPE) values ('GGA','202118','2003','APP2'); 
Insert into FSECURE (USERID,F_ELEMENT,O_ELEMENT,TYPE) values ('GGA','140','2004','APP2'); 
Insert into FSECURE (USERID,F_ELEMENT,O_ELEMENT,TYPE) values ('RFA','202116','3662','APP3'); 
Insert into FSECURE (USERID,F_ELEMENT,O_ELEMENT,TYPE) values ('FFA','110001','3662','APP3'); 

CREATE TABLE FVOL 
     ( "ORG" VARCHAR2(6 BYTE), 
     "ORG_PRED" VARCHAR2(6 BYTE) 
     ); 
Insert into FVOL (ORG,ORG_PRED) values ('2003',null); 
Insert into FVOL (ORG,ORG_PRED) values ('3661','2003'); 
Insert into FVOL (ORG,ORG_PRED) values ('3662','2003'); 
Insert into FVOL (ORG,ORG_PRED) values ('2009',null); 
Insert into FVOL (ORG,ORG_PRED) values ('366X','2009'); 
Insert into FVOL (ORG,ORG_PRED) values ('366P','2009'); 
Insert into FVOL (ORG,ORG_PRED) values ('2004',null); 
Insert into FVOL (ORG,ORG_PRED) values ('1114','2004'); 
Insert into FVOL (ORG,ORG_PRED) values ('2224','2004'); 



CREATE TABLE "FVAL" 
    ( "FUND" VARCHAR2(6 BYTE), 
    "FUND_PRED" VARCHAR2(6 BYTE) 
    ); 
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'); 
Insert into FVAL (FUND,FUND_PRED) values ('110001','11000'); 
Insert into FVAL (FUND,FUND_PRED) values ('110002','11000'); 

ソリューションBY CONNECTを使用したソリューションです。

2つのビューは階層のリーフノードを取得し、メインクエリはそれらを結合します。私はより良く理解するためにビューを別々に実行することをお勧めします。

ここ

SQLフィドルデモ - http://sqlfiddle.com/#!4/a2a751/23

+0

おかげで、あなたの出力をラメシュ右に見えますが、あなたが投稿したクエリは、私はそれを実行することを出力しません。データを変更しましたか?おそらく私は何かを失っている前に残念です。 – Miguel

+0

@Miguel - 私がやった唯一の変更は、レコードの1つでNULLの周りの引用符を削除することでした。データも同様に投稿してください。これが機能するかどうかを教えてください。 SQL Fiddleのデモも含まれています - http://sqlfiddle.com/#!4/a2a751/23 – Ramesh

+0

あなたは男です!これは魅力のように機能します。ありがとうございました ! – Miguel

関連する問題