2016-04-05 8 views
0

私はSQL置換

TEST 
---- 
tablename|columnvalue|rankofcolumn 
A|C1|1 
A|C2|2 
A|C3|3 
A|C4|4 
B|CX1|1 
B|CX2|2 
C|CY1|1 
C|CY2|2 
C|CY3|3 

を含むテーブルのテストを持っている私は、このquestionを1として

RESULT 
---- 
tablename|columnvalue|rankofcolumn|path 
A|C1|1|C1 
A|C2|2|C1->C2 
A|C3|3|C1->C2->C3 
A|C4|4|C1->C2->C3->C4 
B|CX1|1|CX1 
B|CX2|2|CX1->CX2 
C|CY1|1|CY1 
C|CY2|2|CY1->CY2 
C|CY3|3|CY1->CY2->CY3 

を次のように他の列と一緒にパスを生成したい、私は再帰的に使用することができますこれを達成するCTE

WITH r (tablename, columnvalue, rankofcolumn, PATH) AS 
     (SELECT tablename, 
        columnvalue, 
        rankofcolumn, 
        columnvalue 
      FROM  test 
      WHERE  rankofcolumn = 1 
      UNION ALL 
      SELECT xx.tablename, 
        xx.columnvalue, 
        xx.rankofcolumn, 
        r.PATH || '->' || xx.columnvalue 
      FROM  r 
        JOIN test xx 
         ON  xx.tablename = r.tablename 
          AND xx.rankofcolumn = r.rankofcolumn + 1) 
SELECT * 
FROM  r; 

しかし、私はこのオプションが欠けているWX2データベースを使用しています 瞬間。このためのSQLの代替手段はありますか?

+0

WX2はCTEを促進しないか、この出力の別の解決策を依頼しています – mohan111

+0

前の質問では、中間テーブルが許可されていました。まだOKですか? –

+0

@AlexPoole Yep。中間のテーブルやビューを持つことができます。 – SriniV

答えて

1

段階的にポピュレートする表でブルートフォースアプローチを実行できます。

create table test (tablename varchar2(9), columnvalue varchar2(11), rankofcolumn number); 

その後、resultテーブルを使用して作成することができます:

insert into result (tablename, columnvalue, rankofcolumn, path) 
select t.tablename, t.columnvalue, t.rankofcolumn, t.columnvalue 
from test t 
where t.rankofcolumn = 1; 

3 rows inserted. 

繰り返し:

create table result (tablename varchar2(9), columnvalue varchar2(11), rankofcolumn number, 
    path varchar2(50)); 

が続いて最低ランクのための結果エントリを作成し、あなたのtestテーブルと仮定するようになります既存の最高ランクに基づいて行を追加し、次の値を取得します(その場合はtablename) e testテーブル:

insert into result (tablename, columnvalue, rankofcolumn, path) 
select t.tablename, t.columnvalue, t.rankofcolumn, 
    concat(concat(r.path, '->'), t.columnvalue) 
from test t 
join result r 
on r.tablename = t.tablename 
and r.rankofcolumn = t.rankofcolumn - 1 
where t.rankofcolumn = 2; 

3 rows inserted. 

insert into result (tablename, columnvalue, rankofcolumn, path) 
select t.tablename, t.columnvalue, t.rankofcolumn, 
    concat(concat(r.path, '->'), t.columnvalue) 
from test t 
join result r 
on r.tablename = t.tablename 
and r.rankofcolumn = t.rankofcolumn - 1 
where t.rankofcolumn = 3; 

2 rows inserted. 

insert into result (tablename, columnvalue, rankofcolumn, path) 
select t.tablename, t.columnvalue, t.rankofcolumn, 
    concat(concat(r.path, '->'), t.columnvalue) 
from test t 
join result r 
on r.tablename = t.tablename 
and r.rankofcolumn = t.rankofcolumn - 1 
where t.rankofcolumn = 4; 

1 row inserted. 

テーブルの最大数どのテーブルでも最高rankofcolumn)。ゼロ行が挿入されるまで反復するWX2では手続き的に行うことができます。あなたはそれをかなり限定されたものにしました。

はすべてのそれらの反復後の表は、今含まれています

select * from result 
order by tablename, rankofcolumn; 

TABLENAME COLUMNVALUE RANKOFCOLUMN PATH            
--------- ----------- ------------ -------------------------------------------------- 
A   C1      1 C1             
A   C2      2 C1->C2            
A   C3      3 C1->C2->C3           
A   C4      4 C1->C2->C3->C4          
B   CX1     1 CX1            
B   CX2     2 CX1->CX2           
C   CY1     1 CY1            
C   CY2     2 CY1->CY2           
C   CY3     3 CY1->CY2->CY3          

は、Oracleでテストが、Oracle固有の何かを避けるためにしよう。もちろんWX2の調整が必要かもしれません。

+0

このビットに@Alexをありがとう。しかし、私たちがJOINの中でこれらのすべてのステップを行うことができたら??私は、レベルを言うconfigテーブルを持つことができますし、これを達成するためにクロスジョイン? – SriniV

+0

再帰なしではありません。選択内には作成/挿入できません。それが部分的にCTEが有用な理由です。あなたは、(再帰的ではない)反復的なCTEを持っていて、各自で漸進的により多くの自己結合を行うことができますが、それはさらに面倒です。 –

+0

あなたのこの本物の努力を高く評価してください。ありがとう – SriniV