J'essaie de réutiliser certaines colonnes que je calcule dynamiquement dans Oracle SQL, quelque chose commeComment réutiliser des colonnes dynamiques dans une instruction SQL Oracle?
SELECT
A*2 AS P,
P+5 AS Q
FROM tablename
Où tablename 'a une colonne appelée « A », mais aucun autre colums. Cela me donne un
ORA-00904: "P": invalid identifier
Je sais comment contourner ce problème en utilisant un sous-requête comme
SELECT P, P+5 AS Q
FROM (SELECT A*2 AS P FROM tablename)
mais je pense que cela est un peu laid. En outre, je veux rendre la requête un peu plus complexe, par ex. réutiliser 'Q' aussi, et je ne veux pas créer encore une autre sous-requête.
Mise à jour: La raison pour laquelle je veux stocker le calcul de 'P' est que je veux le rendre plus complexe, et réutiliser plusieurs fois 'P'. Donc je ne veux pas dire explicitement 'A * 2 + 5 AS Q', parce que cela deviendrait vite lourd, car 'P' devient plus complexe.
Il doit y avoir un bon moyen de le faire, des idées?
Mise à jour: Je dois souligner que je ne suis pas un DB-admin :(
Mise à jour:.. Un exemple du monde réel, avec une requête plus concrète ce que je voudrais faire est:
SELECT
SL/SQRT(AB) AS ALPHA,
5*LOG(10,ALPHA) AS B,
2.5*LOG(10,1-EXP(-5/ALPHA)*(5/ALPHA+1)) AS D
BS -2.74 + B + D AS BSA
FROM tablename
pour l'instant, je l'ai écrit sur, ce qui fonctionne, mais est laid:
SELECT
SL/SQRT(AB) AS ALPHA,
5*LOG(10,SL/SQRT(AB)) AS B,
2.5*LOG(10,1-EXP(-5/(SL/SQRT(AB)))*(5/(SL/SQRT(AB))+1)) AS D
BS -2.74 + 5*LOG(10,SL/SQRT(AB)) + 2.5*LOG(10,1-EXP(-5/(SL/SQRT(AB)))*((5/(SL/SQRT(AB)))+1)) AS BSA
FROM tablename
que je pouvais faire tout cela après avoir reçu les données, mais je pensais, nous allons voir comment beaucoup je peux laisser la base de données faire. En outre, je voudrais également choisir sur 'BSA' (que je peux faire maintenant avec cette requête comme subquery/with-clause).
Mise à jour: OK, je pense que pour l'instant j'ai fini avec la solution de Cade Roux et Dave Costa. Bien que la solution de Pax 'et Jens Schauder soit meilleure, mais je ne peux pas les utiliser puisque je ne suis pas un administrateur de base de données. Maintenant, je ne sais pas qui marquer comme la meilleure réponse :). dans le cas où quelqu'un est intéressé
WITH
A1 AS (
SELECT A0.*,
SL/SQRT(AB) AS ALPHA
FROM tablename A0
),
A2 AS (
SELECT A1.*,
5*LOG(10,ALPHA) AS B,
2.5*LOG(10,1-EXP(-5/ALPHA)*((5/ALPHA)+1)) AS D
FROM A1
)
SELECT
ALPHA, B, D, BS,
BS -2.74 + B + D AS BSA
FROM A2
BTW,, SB est la 'brillance de surface' de galaxies, pour lesquelles B et D sont des termes de correction.
haha, ça a quand même causé des effets secondaires! parce que j'ai d'abord utilisé 'T' et 'S' pour mes nouvelles colonnes, qui existaient! donc il n'y avait pas d'erreur, seulement des valeurs totalement incorrectes. (+ De 200 colonnes, tous les 2-5 caractères ...) – BlackShift
Les résultats sont supposés être invariants dans le changement d'ordre de colonne. Heureusement, ANSI offrira un certain soulagement sous la forme d'une sorte de directive d'empilage en ligne. –