sql >> データベース >  >> RDS >> Oracle

Oracleの列名をtable.column形式で返しますか?

    Oracleにはこれを行うための「オプション」はありません。あなたはかもしれません これは通常クライアントで行われる仕事であるため、そうすることを可能にするクライアントを見つけることができます。知りません。

    tboneの回答 を拡張するには これを動的に行う必要があります。これはありません つまり、すべての列をリストする必要があります。 データディクショナリ を使用します 具体的には、 all_tab_columns またはuser_tab_columns クエリを作成します。必要に応じて再利用できるように、必要な定義でビューを作成する方が簡単です。

    目的は、列の存在がテーブルに文字列として格納されているという事実を使用して、その列を使用するクエリを作成することです。列名とテーブル名は文字列として保存されるため、文字列集計手法を使用してクエリまたはDDLステートメントを簡単に作成し、手動または動的に実行できます。

    Oracle 11gリリース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);
    

    この単一のクエリは次を生成します:

    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
    

    これが SQLFiddle です。 それを証明するために。

    11.2を使用していない場合は、文書化されていない関数 wm_concat<を使用してまったく同じ結果を得ることができます。 / code> または、ユーザー定義関数 stragg 、トムカイトによって作成されました。 Oracle Baseには、文字列集約手法 に関する記事があります。 StackOverflowには多くの投稿があります。

    ちょっとした補遺として、上記のクエリに少し変更を加えるだけで、実際に探しているものを正確に作成できます。 引用された識別子 を使用できます 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
    


    1. 複製でのMySQL条件付き挿入

    2. 同じモデルへの複数の関係CakePHP

    3. MYSQLで削除を中止するトリガーを作成するにはどうすればよいですか?

    4. c#はSQLテーブル(特殊文字を含む)をDataSetに読み込みます