2016-09-14 9 views
0

私は2つのテーブルTAB_ATAB_Bを持っています。TAB_AにはTAB_Bの列名が含まれています(すべての列を含んでいません)。私はすべてが、テキストの代わりに、列名として値を取っている、いくつかのことを試してみました秘密のテキストを列名

TAB_A.FIELD  
COLUMN_1 
COLUMN_2 
COLUMN_3 


    TAB_B 
COLUMN_1 COLUMN_2 COLUMN_3 COLUMN_4 
1   A   S   100 
2   V   F   200 
3      B   300 


Output 
FIELD  VALUE 
COLUMN_1 1 
COLUMN_1 2 
COLUMN_1 3 
COLUMN_2 A 
COLUMN_2 V 
COLUMN_3 S 
COLUMN_3 F 
COLUMN_3 B 

以下のように各列の値を一覧表示するには、SQLクエリ(ないPL/SQL)を構築する必要があります。

+0

Javaや.NETなどから実行するためにこのクエリを「オンザフライ」で構築していますか?または、それは缶詰めされ、事前解析されたSQLステートメントである必要がありますか? –

答えて

0

これは必要な操作ですか?

select 'column1' as field, column1 as value from t where column1 is not null 
union all 
select 'column2' as field, column2 as value from t where column2 is not null 
union all 
select 'column3' as field, column3 as value from t where column3 is not null 
union all 
select 'column4' as field, column4 as value from t where column3 is not null; 

これは「アンピボット」操作であり、そこにあまりにも多くの列ではなく、データが大きすぎないときunion allが合理的なアプローチです。別の表に基づいて列を選択する必要がある場合は、動的SQLを使用する必要があります。

+0

TAB_B Countが100を超えていて、私は列名を認識していません。 @Gordon Linoff –

0

外部でパースして実行するクエリを構築する場合は、可能です。あらかじめ解析されたSQL文では、パーサーが有効かどうかを調べるためにクエリを実行する必要があるため、オブジェクト名を取得した値と動的に比較することはできません。または、tab_a.fieldの列名がtab_bの実際の列として存在しない場合、どのように扱うでしょうか?

1)tab_a.fieldから個別値のリストを選択し、文字列リテラルとしてカンマ区切りのリストにそれらを組み立てる:あなたはできる2つの段階でこれを行うことができれば、と述べ

2)ここに正しい場所にリテラル、その文字列を入れて: 選択COL_NAME、ヴァルをtab_b アンピボットから(COL_NAMEためのval(中:your_list_from_step_1)COL_NAMEによる) ため、ヴァル

3)は、それを実行します。

でも、tab_bのすべての列の基本データ型が同じであれば、これは機能します。オラクルが数字、文字列、日付の組み合わせを単一の列で検索するにはどうしたらいいですか?戻りカーソルはタイプされます。

これを解決するには、tab_bの可能なすべての列のすべてのデータ型を検索し、上のビューを上書きしてすべてを単一のデータ型に正規化するようにデータ辞書を照会する必要がありますvarchar2)をすべて1つのカーソル列に戻すことができます。

あなたが本当にこのルートを下るつもりなら、私はあなたに頭痛を羨ましくはありません。しかし、私は1つのことを保証しています。オブジェクト名を指すクエリメタデータをあらかじめ準備され、事前に解析されたクエリにマージする方法は見つけられません。 Oracleのパーサーは、オブジェクト名を問合せ内の文字列リテラルにのみ一致させます。動的に値を取得するのではありません。