Ich versuche, einige Spalten wiederzuverwenden, die ich dynamisch in Oracle SQL berechne, etwa so
SELECT
A*2 AS P,
P+5 AS Q
FROM tablename
Die Spalte "Tabellenname" hat eine Spalte mit dem Namen "A", aber keine anderen Spalten. Dies gibt mir eine
ORA-00904: "P": invalid identifier
Ich weiß, wie man dieses Problem umgehen kann, indem man eine Unterabfrage wie
SELECT P, P+5 AS Q
FROM ( SELECT A*2 AS P FROM tablename )
aber ich denke, das ist ziemlich hässlich. Außerdem möchte ich die Abfrage etwas komplexer gestalten, z. B. auch "Q" wiederverwenden, und ich möchte nicht noch eine weitere Unterabfrage erstellen.
Aktualisierung: Der Grund, warum ich die Berechnung von "P" speichern möchte, ist, dass ich sie komplexer gestalten und "P" mehrfach verwenden möchte. Ich möchte also nicht explizit sagen "A*2+5 AS Q", denn das würde schnell zu umständlich werden, wenn "P" komplexer wird.
Es muss doch eine gute Möglichkeit geben, dies zu tun, haben Sie eine Idee?
Update: Ich sollte anmerken, dass ich kein DB-Admin bin :(.
Update: Ein Beispiel aus der Praxis, mit einer konkreteren Abfrage. Was ich gerne tun würde, ist:
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
Ich habe es vorerst ausgeschrieben, was funktioniert, aber hässlich ist:
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
Ich könnte all dies tun, nachdem ich die Daten erhalten habe, aber ich dachte, mal sehen, wie viel ich die Datenbank machen lassen kann. Außerdem möchte ich auch nach "BSA" auswählen (was ich jetzt mit dieser Abfrage als Unterabfrage/Mit-Klausel tun kann).
Aktualisieren: OK, ich glaube, ich bin jetzt mit der Lösung von Cade Roux und Dave Costa fertig. Obwohl die Lösung von Pax und Jens Schauder besser aussehen würde, aber ich kann sie nicht verwenden, da ich kein DBA bin. Jetzt weiß ich nicht, wen ich als die beste Antwort markieren soll :).
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
Übrigens, falls es jemanden interessiert: SB ist die "Oberflächenhelligkeit" von Galaxien, für die B und D Korrekturterme sind.