2009-05-21 33 views
0

甲骨文再選擇下列SQL選擇:動態表,我想運行列

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列。這是我希望能做的最好的嗎?

回答

2

你將不得不這樣做與dynamic SQL即PL/SQL或動態構建您的SQL語句在您的應用程序。如您所知,Oracle不支持這種行爲。

1

它可能更容易使用cletus的解決方案。

但是這樣做並非完全不可能,你可以使用dbms_xmlgen.getxml(' '),使用dbms_xmlgen.getxml(' ')就可以在sql語句中生成動態sql語句。

不要期待好的表現!

見例如:Identify a table with maximum rows in Oracle

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個將使這很醜陋雖然