2017-01-18 4 views
0

を使用していない私は、以下の要件を持って、TABLE1から列「SNAME」からオラクルSQL:列名として使用してカラム値、動的SQL

値は表2から列からデータをフェッチするために使用されるべきですこれは同じ名前です。

例えば、table1は値として「Segment1」を持っています。これを使用してtable2から 'Segment1'列のデータを取得する必要があります。 は表2に

select * from table1; 
sid   sname 
------------------------------ 
1   Segment1  
1   Segment2 



select * from table2; 
appId  Segment1  Segment2 
--------------------------------- 
a1   fld1   fld2 
a2   cmp1   cmp2 

[Iは、SIDとAPPID値を有する]、 'A1' が古い行であり、A2は新しい行です。私がCLOBから得ることができるこのすべての情報。

だから私は、データが、私は、これは、動的SQLを使用していないしたいと思うこの

segment oldvalue newvalue 
---------------------------- 
segment1 fld1 cmp1 
segment2 fld2 cmp2 

のように表示することにしたいです。前もって感謝します。

この問題を解決するには動的SQLが必要な場合は、ソリューションを共有してください。

注:表1のセグメント数(データとして)と表2の 「セグメント」列の数は異なる場合があります。

+0

これは動的SQLなしでは不可能です。ただし、「動的SQL」とは単にSQL文字列を特別な形で構築することを意味します。 table1から名前を選択し、結果をループし、query2を選択してtable2から選択します。 PL/SQLやその他のプログラミング言語(Java、PHPなど)を使用してそのことを行うことができます。 –

答えて

0

一般に、列に動的に名前を付けることはできません。あなたが記述した特定の問題については、あなたが望むことを以下のようにすることができます:

select segment, max(oldvalue) as oldvalue, max(newvalue) as newvalue 
from ((select 'segment1' as segment, segment1 as oldvalue, null as newvalue 
     from table2 
     where appid = 'a1' 
    ) union all 
     (select 'segment1' as segment, NULL as oldvalue, segment1 as newvalue 
     from table2 
     where appid = 'a2' 
    ) union all 
     (select 'segment2' as segment, segment2 as oldvalue, null as newvalue 
     from table2 
     where appid = 'a1' 
    ) union all 
     (select 'segment2' as segment, NULL as oldvalue, segment2 as newvalue 
     from table2 
     where appid = 'a2' 
    ) 
    ) t 
group by segment; 
+0

こんにちはGordon、これはまだ列名をハードコーディングしています。動的SQLが必要な場合は、この要件の解決策を提供してください。 –

+3

@SushmaNookaはい、 "動的ではありません" meas "ハードコーディング" - これはあなたが求めているものです。 –

関連する問題