帧动态sql查询

时间:2017-10-26 15:50:49

标签: sql oracle plsql dynamic-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.

如果我添加更多表,则应该进行联合查询

1 个答案:

答案 0 :(得分:1)

您可以LISTAGG使用seq, table_name分组{/ 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