2017-10-26 20 views
0

コントロールテーブルを使用してテーブルから列を選択するための汎用コードを作成する予定です。フレーム動的SQLクエリ

私のコントロール表:

サンプルダイナミッククエリ:

SEQ Table_Name Column_name 
1 X X1 
1 X X2 
1 X X3 
2 Y Y1 
2 Y Y2 
2 Y Y3 
2 Y Y4 
3 Z Z1 
3 Z Z2 

はサンプル以下のようなものを達成する上で助けが必要

Select Y1,Y2,Y3,Y4 from Y; 

私は制御テーブルのテーブル名を作成する場合以下のように動的です。

Select X1,x2,X3 from x 
Union 
Select y1,y2,y3,y4 from y 
Union 
Select z1,z2 from z. 

は、私はそれはあなたがseq, table_nameして、グループでLISTAGGを使用することができますユニオンクエリ

答えて

1

をしなければならない複数のテーブルを追加する場合。

SELECT 'select ' 
     ||Listagg(column_name, ',') 
      within GROUP (ORDER BY seq) 
     ||' FROM ' 
     || table_name query 
FROM control_table 
GROUP BY seq, 
      table_name; 

O/P:

QUERY 
----- 
select X1,X2,X3 FROM X 
select Y1,Y2,Y3,Y4 FROM Y 
select Z1,Z2 FROM Z 

編集:私は以下 などの動的制御テーブル内のテーブル名を作成する場合は

、提案してください。

別のLISTAGGを使用できます。しかし、クエリが4000文字を超えてはならないので、私はこれをお勧めしません。追加する手順はPL/SQLとしてください。私はあなたにそのアイデアを与えましたか?

WITH tabs 
    AS (SELECT 'select ' 
       ||Listagg(column_name, ',') 
        within GROUP (ORDER BY seq) 
       ||' FROM ' 
       || table_name query 
     FROM control_table 
     GROUP BY seq, 
        table_name) 
SELECT Listagg(query, ' UNION ') 
     within GROUP (ORDER BY ROWNUM) final_query 
FROM tabs; 

http://sqlfiddle.com/#!4/7c115/10

+0

おかげで、私は以下のような制御テーブルのテーブル名は、動的にしたい場合は、提案してください。 x1、x2、x3をxから選択する ユニオン y1、y2、y3、y4をyから選択する ユニオン zからz1、z2を選択します。 テーブルを追加すると、ユニオンクエリーが作成されます。 – Amjath

+0

@Amjath:編集済みのチェックがすぐに行われました。私はあなたがやろうとしていることよりも、より良い対処法があると感じています。特にあなたのデータベース設計。 –

+0

あなたはそうです、listaggは4000個の文字しか扱っていません。私はストアドプロシージャのすべてを作ることを考えていた。しかし、他の簡略化されたクエリがあればそれを探してください – Amjath