oracle subselect with dynamic table and column

时间:2009-05-21 11:19:31

标签: sql oracle

我想运行以下SQL select:

SELECT ID,
NUMERATOR,
(SELECT m.COLUMNNAME FROM m.TABLENAME p WHERE p.numerator = m.numerator
) VALUE,
TABLENAME,
COLUMNNAME
FROM MainTable m;

在当前状态下它根本不运行,当然,因为oracle根本不识别m.TABLENAME。有可能以某种方式做这种事吗?对于COLUMNNAME也是如此 - 即使我暂时将表替换为我所获得的某个“真实”表,在当前语法中它只输出m.COLUMNNAME内的值而不是p内的值,在名称为m.COLUMNNAME的列中 希望我能清楚地了解它。

我想我的另一种方法是创建一个迭代第一个查询结果的过程,并为每个查询执行另一个选择以填充VALUE列。这是我能做的最好的事情吗?

3 个答案:

答案 0 :(得分:2)

您将不得不使用dynamic SQL即PL / SQL或在应用程序中动态构建SQL语句。如您所知,Oracle不支持此行为。

答案 1 :(得分:1)

如果只有少数可能的表名/列名,您可以执行类似

的操作
SELECT ID,
      NUMERATOR,
      case 
        when m.table_name = 'A' and m.column_name = 'B' then
          (SELECT b FROM a WHERE a.numerator = m.numerator)
        when ....
      end VALUE,
      TABLENAME,
      COLUMNNAME
FROM MainTable m;

任何超过3或4的东西都会让这个非常丑陋但是

答案 2 :(得分:1)

使用cletus解决方案可能更容易。

但这并非完全不可能,你可以使用dbms_xmlgen.getxml(' '),使用dbms_xmlgen.getxml(' ')可以在sql语句中创建动态sql语句。

不要期待良好的表现!!

例如参见:Identify a table with maximum rows in Oracle