これを行うための「オプション」は Oracle にはありません。これは通常クライアントで実行されるジョブであるため、これを可能にするクライアントを見つけることができる場合があります。私は一つも知りません。
tbone の回答を拡張するには、これを動的に行う必要があります。これは、すべての列をリストする必要があるという意味ではありません。データ ディクショナリ、具体的にはall_tab_columnsを使用するかuser_tab_columns
、クエリを作成します。必要に応じて再利用できるように、必要な正確な定義でビューを作成する方が簡単です。
目的は、その列を使用するクエリを作成するために、列の存在が文字列としてテーブルに格納されているという事実を使用することです。列名とテーブル名は文字列として格納されるため、文字列集計手法を使用して、手動または動的に実行できるクエリまたは DDL ステートメントを簡単に作成できます。
Oracle 11g Release 2 を使用している場合は、次のlistagg
機能を利用できます。
select 'create or replace view my_view as
select '
|| listagg( table_name || '.' || column_name
|| ' as '
|| substr(table_name,1,1) || '_'
|| column_name, ', ')
within group
( order by case when table_name = 'FOO' then 0 else 1 end
, column_id
)
|| ' from foo f
join bar b
on f.id = b.foo_id'
from user_tab_columns
where table_name in ('FOO','BAR')
;
次のテーブル構造を想定します。
create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);
この 1 つのクエリで次の結果が生成されます。
create or replace view my_view as
select FOO.ID as F_ID, FOO.A as F_A, FOO.B as F_B, FOO.C as F_C
, BAR.FOO_ID as B_FOO_ID, BAR.A as B_A, BAR.B as B_B, BAR.C as B_C
from foo f
join bar b on f.id = b.foo_id
これを証明するSQL Fiddleがあります。
11.2 を使用していない場合は、文書化されていない関数またはTom Kyte によって作成されwm_concat
たユーザー定義関数を使用して、まったく同じ結果を得ることができます。Oracle Base には文字列集計手法stragg
に関する記事があり、Stack Overflow には多くの投稿があります。
ちょっとした補遺として、上記のクエリを少し変更するだけで、実際に探しているものを正確に作成できます。引用符付き識別子を使用して、TABLE_NAME.COLUMN_NAME
フォーマットで列を作成できます。Oracle ではオブジェクト名として有効な文字ではないため、引用符で囲む必要があります。.
これの利点は、あなたが望むものを正確に得ることです。欠点は、作成されたビューをクエリするのは、使用しないと非常に面倒なことですselect * from ...
。名前付き列を選択するには、それらを引用する必要があります。
select 'create or replace view my_view as
select '
|| listagg( table_name || '.' || column_name
|| ' as '
|| '"' || table_name || '.'
|| column_name || '"', ', ')
within group
( order by case when table_name = 'FOO' then 0 else 1 end
, column_id
)
|| ' from foo f
join bar b
on f.id = b.foo_id'
from user_tab_columns
where table_name in ('FOO','BAR')
;
このクエリは次を返します。
create or replace view my_view as
select FOO.ID as "FOO.ID", FOO.A as "FOO.A", FOO.B as "FOO.B", FOO.C as "FOO.C"
, BAR.FOO_ID as "BAR.FOO_ID", BAR.A as "BAR.A"
, BAR.B as "BAR.B", BAR.C as "BAR.C"
from foo f
join bar b on f.id = b.foo_id