2009-05-21 8 views
0

Je voudrais lancer la sélection SQL suivante:oracle subselect avec table dynamique et la colonne

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

à l'état actuel, il ne fonctionne pas du tout, bien sûr, parce que l'oracle ne reconnaît pas la m.TABLENAME du tout. Est-il possible de faire quelque chose de ce genre? La même chose pour le COLUMNNAME - même si je remplace temporairement la table par une table "réelle", à la syntaxe actuelle, elle renvoie simplement la valeur m.COLUMNNAME au lieu de la valeur dans p, à la colonne dont le nom est m.COLUMNNAME.
J'espère avoir réussi à être clair à ce sujet.

Je suppose que mon autre moyen de le faire est de créer une procédure qui répète les résultats de la première requête et d'exécuter une autre sélection pour chacun d'entre eux afin de remplir la colonne VALUE. Est-ce le meilleur que je puisse espérer faire?

Répondre

2

Vous devrez faire cela avec dynamic SQL ie PL/SQL ou construire dynamiquement votre instruction SQL dans votre application. Comme vous le constatez, Oracle ne supporte pas ce comportement.

1

Il est probablement plus facile d'utiliser les solutions de Cletus.

Mais il n'est pas tout à fait impossible de le faire, vous pouvez utiliser dbms_xmlgen.getxml(' '), en utilisant dbms_xmlgen.getxml(' ') permet de faire des instructions SQL dynamiques dans une instruction SQL.

Ne vous attendez pas à de bonnes performances !!

Voir par exemple: Identify a table with maximum rows in Oracle

1

S'il y a seulement une poignée de noms nom de table possible/colonne que vous pourriez faire quelque chose comme

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; 

Rien de plus que 3 ou 4 rendrait cette jolie laide bien

Questions connexes