2016-05-27 3 views
1

を列を構築:オラクル選択クエリ、私のようなクエリを通じて主キーを返しています動的

SELECT b.column_name 
FROM all_constraints a, all_cons_columns b 
WHERE a.constraint_name = b.constraint_name 
AND a.table_name = 'tableX'; 
AND a.constraint_type = 'P' 

...とクエリは、例えば、3行を返します。

B
C

今、私のような別のクエリを作成するには、上記のクエリにネストされたクエリを作成したい:

SELECT A, B, C 
FROM tableY 

をだから、A、B、Cの部分があることが必要クエリに置き換えられました。何か案は? Oracle 11Gを使用しています。

+4

[ 'EXECUTE IMMEDIATE'](https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/executeimmediate_statement.htm)。 –

+1

ストレートフォワードSQLは、動的に変化する数のカラムを処理できません。つまり、メタデータデータテーブルを読み取って、必要な列を含む別のSQL文を記述するコード(SQLまたは別の言語)を記述する必要があります。動的に記述されたSQL文を実行します。 – MatBailie

答えて

1

EdとMatが示唆しているように、これはほぼ確実にEXECUTE IMMEDIATEまたはクエリを出力するPL/SQLブロックによって最もよく行われます。

これはまれなケースですが、これを単一のSQL文で実行する必要がある場合は、私のオープンソースプロジェクトMethod4を試してみてください。クエリによって生成されたクエリを実行できます。パワフルですが、通常のSQL文よりも混乱し、遅く、バグがあります。あなたが必要とする動的なOracleのクエリのために

--Sample schema: 
drop table tablex; 
create table tableX(A number, B number, C number, D varchar2(10), 
    constraint tableX_pk primary key (A,B,C)); 
insert into tableX values (1,2,3,'4'); 

--Query the primary key columns of a table. 
select * from table(method4.dynamic_query(
    q'[ 
     --Query that returns a query. 
     SELECT 
      'select '||listagg(b.column_name,',') within group (order by column_name)|| 
      ' from '||a.table_name v_sql 
     FROM all_constraints a, all_cons_columns b 
     WHERE a.constraint_name = b.constraint_name 
      AND a.table_name = 'TABLEX' 
      AND a.constraint_type = 'P' 
     GROUP BY a.table_name 
    ]' 
)); 

--Results: 
A B C 
- - - 
1 2 3 
+0

私はあなたの答えから必要なものを得ました。 – Dragonfly

関連する問題